这些char数组分解之后发生了什么?

时间:2019-04-02 13:27:59

标签: c arrays pointers alias

这是整个代码:

#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

导致这些结果的编译器背后发生了什么?

2 个答案:

答案 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).
相关问题