在char指针上使用strcpy时程序中止? 在char数组上工作正常

问题描述

| 我为以下原因感到困惑:
char * f = \"abcdef\";
strcpy(f,\"abcdef\");
printf(\"%s\",f);

char s[] = \"ddd\";
strcpy(&s[0],\"eee\");
printf(\"%s\",s);
在两个示例中,strcpy都收到一个字符*,但在第一个示例中,它死于可怕的死亡。     

解决方法

\"abcdef\"
\"ddd\"
是字符串文字,可以驻留在地址空间的只读部分中。
char s[] = \"ddd\"
确保将此文字复制到堆栈中-因此可以修改。     ,
char * f = \"abcdef\";
定义了一个指向\“ abcdef \”的char指针,该指针位于只读区域,因此您无法写入该位置 “ 5”在堆栈上定义了一个可写的char数组。     ,在第一个示例中,您有一个指向字符串文字的指针。该指针实际上应为“ 6”,因为任何尝试修改字符串文字的操作都是未定义的行为。但是,由于遗留原因,您可以使用ѭ7指向它。但是您仍然不应该尝试对其进行修改。 在第二个版本中,您有一个沼泽标准数组,其内容恰好初始化为与您的字符串等效。这是可修改的,因为它是您的数组。     ,第一个示例是字符文字的“ 7”(文字是“ 9”)。字符文字是只读的,尝试写入它们可能会导致崩溃。您的第一个指针实际上应该是
const char *f = \"abcdef\";
strcpy
不会。     ,语句“ 12”将内存中的一个点分配给文字字符串“ abcdef”,但是它将拒绝您修改其内容,直到动态分配内存为止-它等效于“ 13”。 您要做的就是在内存中创建一个指针,然后写入接下来的6个字节,这在C语言中是非法的。     ,大多数编译器都将字符串文字视为只读,因此可以将它们驻留的内存标记为只读,从而导致运行时错误。 要使其正常工作,请执行以下操作:
char * f = strdup(\"abcdef\");
strcpy(f,\"abcdef\");
printf(\"%s\",f);
free(f);
这会在堆内存中创建字符串的可修改副本,当然需要在程序结束时将其释放。