• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

C语言字符串常量赋给指针后不能修改的原因分析


Recommended Posts

C语言 字符串常量赋值给指针后不可修改原因分析

/转载请注明出处和作者/

/作者:多巴胺/

一、问题描述

字符串赋值给指针后,再次赋值时会报错。但是,当指针被指定为指针数组时,它可以被修改。

char * a=(char *)malloc(sizeof(char)* 5);

char * b=(char *)malloc(sizeof(char)* 5);

a=' ABC \ 0

b[0]=' A ';B[1]=' B ';b[2]=' C ';b[3]=' \ 0 ';

a[0]=' E ';

b[0]=' E ';

二、分析

查看指针所指向的地址是否发生改变

char * a=(char *)malloc(sizeof(char)* 5);char * b=(char *)malloc(sizeof(char)* 5);

char * d=(char *)malloc(sizeof(char)* 5);char * e=(char *)malloc(sizeof(char)* 5);

//打印地址

printf('a:%d\n ',* a);printf('b:%d\n ',* b);printf('d:%d\n ',* d);printf('e:%d\n ',* e);

printf(' \ n \ n ');

a=' ABC \ 0e=' ABC \ 0

b[0]=' A ';B[1]=' B ';b[2]=' C ';b[3]=' \ 0 ';

char c[5]=' ABC \ 0 ';

d=' ABCD \ 0

//赋值后打印地址,看有没有变化。

printf('a:%d\n ',* a);printf('b:%d\n ',* b);printf('c:%d\n ',* c);printf('d:%d\n ',* d);printf('e:%d\n ',* e);

printf(' \ n ');

c[0]=' E ';printf('c:%s\n ',c);

image

总结:

(1)发现给指针赋一个字符串常量后,指针指向的地址发生了变化。a和e是两个指针变量,但是被赋了同一个字符串常量后,指向的内存地址是一个。

(2)数组C可以修改,地址空间离其他变量特别远。

说明:数组C打开的空间在堆栈中。

(3)

a=' ABC \ 0d=' ABCD \ 0

A和D指向的字符串只有一个字母的距离,但是它们的直接地址是不同的。

注意:这是两个字符串常量,同时也说明了在程序初始化的时候,只有程序要使用的字符串常量会放在一个区域(只读,不可修改)。

(4)b的地址没有变。

注意:虽然B是指针变量,但它是在数组中赋值的,所以它的地址空间也在堆栈中,可以修改。

三、结论

当malloc()用于为指针创建空间时,创建的空间指向堆栈中的空间。但是如果给它赋了一个常量,指针会指向未修改的常量区域,但是之前打开的空间依然存在。

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now