在内存中存储字符指针

storage of character pointer in memory

本文关键字:字符 指针 存储 内存      更新时间:2023-10-16

有这个代码

char *p;
p[0]='a';
p[1]='b';
printf("%s",p);

当我在ideone.com compiler: c++ 4.3.2上运行这个程序时,每次我运行它时都显示"RUNTIME ERROR"。

1 b)。但是,当我将这段代码编辑为

char *p;
//allocate memory using malloc
p[0]='a';
p[1]='b';
printf("%s",p);

正确运行并打印"ab"。它不应该在末尾要求p[2]=''吗?

2)

char *p;
p="abc"
printf("%s",p);

正确运行并打印"abc"。为什么不用分配就能工作。

谁能解释一下关于字符串存储的规则?

1a) 未定义行为因为您解引用了未初始化的指针

1b) 未定义行为,因为您使用%s调用printf以获取非空终止字符串

2)工作正常:有一个分配,它只是一个字符串字面量(你不能修改它,它存储在程序的只读部分:因此你应该声明它const char*)

注意:

c++中使用std::stringstd::cout

在第一个例子中,您声明了一个指向char的指针,然后将值赋给内存中未定义的位置。未定义,因为它是未初始化的p指针指向的。您需要为序列分配内存(c++中使用new[],而不是malloc)。如果您没有将''放在末尾,打印将在内存中遇到的第一个0处停止。

在第三个例子中,你声明了一个指向char的指针,并用字面值字符串"abc"的地址初始化它的值。它存储在可执行文件的(只读)数据段中,并映射到进程地址空间。这是一个有效的指针,打印工作正常

1a)这里你没有分配内存,所以p指针指向一个随机的位置,因此当你写那个随机位置

时导致段错误

1b)如果你用malloc手动分配内存,它将正常工作。如果分配的内存包含0,则不必手动添加它(但应该手动添加,因为不能指望填充0)

2)这里你把p指针赋值给字符串字面量"abs",所以它会指向它,分配是由编译器

完成的