静态C字符串分配问题

请考虑以下代码:

char* str = "Hello World"; memcpy(str, "Copy\0", 5); 

memcpy期间发生分段错误。 但是,使用此代码:

 char str[12]; memcpy(str, "Hello World\0", 12); memcpy(str, "Copy\0", 5); 

该程序不会产生分段错误。

问题来自于在堆栈上分配内存而不是数据部分吗?

在gcc中使用字符串文字时,该值将放在只读内存中,无法修改。 尝试修改它会导致未定义的行为。 通常,当您尝试执行此操作时,您将在Linux上遇到分段错误。

第二个示例有效,因为您没有修改字符串文字,您正在修改存储在非只读变量中的副本。

 char* str = "Hello World"; 

 char str[12]; 

是两个非常不同的东西。 一个在堆栈上分配一个指针,在只读“代码段”中分配一个数组。 然后指针指向数组。 另一个在堆栈上分配整个数组,并且没有指针。