声明字符串和分配字符串之间的区别

Vis*_*ire 5 c

I.  char *str = "Stack";

II. char *str = (char*) malloc(6);
    strcpy(str, "Stack");
Run Code Online (Sandbox Code Playgroud)

上述两种方法有何不同?

窗帘后面是相同还是不同?

Clo*_*oud 20

上面的代码会导致问题.

第一个实例称为静态字符串分配和定义.对于像int等等的常规变量和非字符串数据类型,这样的声明将在堆栈上分配数据.在通过字符串文字(即:)初始化字符串的情况下"stack",它被分配在内存的只读部分中.

不应修改字符串本身,因为它将存储在内存的只读部分中.指针本身可以更改为指向新位置.

即:

char strGlobal[10] = "Global";

int main(void) {
  char* str = "Stack";
  char* st2 = "NewStack";
  str = str2;  // OK
  strcpy(str, str2); // Will crash
}
Run Code Online (Sandbox Code Playgroud)

为了安全起见,您应该实际分配为const数据的指针,即:

const char* str = "Stack"; // Same effect as char* str, but the compiler
                           // now provides additional warnings against doing something dangerous
Run Code Online (Sandbox Code Playgroud)

第二种称为动态分配,它在堆上分配内存,而不是堆栈.可以毫不费力地修改字符串.在某些时候,您需要通过free()命令释放此动态分配的内存.

第三种方法是分配字符串,这是堆栈上的静态分配.这允许您修改保存字符串的数组的内容,并且它是静态分配的.

char str[] = "Stack";
Run Code Online (Sandbox Code Playgroud)

综上所述:

Example:                       Allocation Type:     Read/Write:    Storage Location:
================================================================================
const char* str = "Stack";     Static               Read-only      Code segment
char* str = "Stack";           Static               Read-only      Code segment
char* str = malloc(...);       Dynamic              Read-write     Heap
char str[] = "Stack";          Static               Read-write     Stack
char strGlobal[10] = "Global"; Static               Read-write     Data Segment (R/W)
Run Code Online (Sandbox Code Playgroud)

您还应该了解如何为现代操作系统中的应用程序分割数据.它将真正增加您对代码构建方式的理解.

参考


  1. 数据段,已访问2013-04-15,<http://en.wikipedia.org/wiki/Data_segment>
  2. 代码段,已访问2013-04-15,<http://en.wikipedia.org/wiki/Code_segment>