在内存中存储字符指针
storage of character pointer in memory
有这个代码
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::string
和std::cout
在第一个例子中,您声明了一个指向char
的指针,然后将值赋给内存中未定义的位置。未定义,因为它是未初始化的p
指针指向的。您需要为序列分配内存(c++中使用new[]
,而不是malloc
)。如果您没有将' '
放在末尾,打印将在内存中遇到的第一个0处停止。
在第三个例子中,你声明了一个指向char
的指针,并用字面值字符串"abc"
的地址初始化它的值。它存储在可执行文件的(只读)数据段中,并映射到进程地址空间。这是一个有效的指针,打印工作正常
1a)这里你没有分配内存,所以p指针指向一个随机的位置,因此当你写那个随机位置
时导致段错误1b)如果你用malloc手动分配内存,它将正常工作。如果分配的内存包含0,则不必手动添加它(但应该手动添加,因为不能指望填充0)
2)这里你把p指针赋值给字符串字面量"abs",所以它会指向它,分配是由编译器
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将(N 个字节)无符号字符指针转换为浮点数和双 C++
- 字符指针的 Qt 数组
- C++将常量字符* 指针数组传递给对象
- 为什么不能将字符指针定义为数组?
- 在函数内初始化无符号字符指针将返回空指针
- 将字符指针存储到容器中
- 为什么 strtok_r() 只接受字符数组而不接受字符指针
- 字符指针数组内存分配
- 字符指针不递增?
- 如何在C++中使用字符指针
- 确保字符指针始终指向相同的字符串文字
- C++中的字符指针
- 使用unique_ptr的常量字符指针
- 字符指针不断意外更改
- 将字符指针中的十六进制转换为十进制
- 如何将字符*(字符指针)转换为 PCSZ?
- 在向量中存储字符指针
- 字符指针具有不同的值