这是整个代码:
#include <stdio.h> //printf
#include <stdlib.h> //malloc
#include <string.h> //memcpy
void main(void)
{
char* charMem = (char*) malloc(5 * sizeof(char));
memcpy(charMem, "Hello", 5);
char charArr[] = "Hello";
printf(" charMem = %p\n", charMem);
printf("&charMem = %p\n\n", &charMem);
printf(" charArr= %p\n", charArr);
printf("&charArr= %p\n\n", &charArr);
charMem[2] = 'A';
charArr[2] = 'A';
}
输出为:
charMem = 00F8ABB0 //diff
&charMem = 00CFFBB0 //diff
charArr= 00CFFBA0 //same
&charArr= 00CFFBA0 //same
导致这些结果的编译器背后发生了什么?
答案 0 :(得分:2)
char* charPtr = "Hello";
"Hello"
是char
的只读数组。修改其内容是不确定的行为。
一些程序员喜欢帮助自己
const char *charPtr = "Hello";
以便编译器检查是否尝试更改只读数组的内容。
charPtr[2] = 'A'; // attempt to change a readonly/const element
答案 1 :(得分:2)
您将charPtr声明为指向char的指针,并将其初始化为指向字符串“ Hello”。
字符串“ Hello”保留在内存的只读区域中,因此,当您尝试修改字符串“ Hello”的第3个位置时,它将崩溃。
更正它以便声明
char charPtr[] = "Hello";
像这样声明它就可以对charPtr []数组进行突变。
在附件J.2 Undefined behavior
中,我们看到它何时未定义
— The program attempts to modify a string literal (6.4.5).