程序在char指针上使用strcpy时中止? (在char数组上正常工作)
我很困惑为什么以下不起作用:
char * f = "abcdef"; strcpy(f, "abcdef"); printf("%s",f); char s[] = "ddd"; strcpy(&s[0], "eee"); printf("%s", s);
在这两个例子中,strcpy收到了一个char *但是在第一个例子中它死了一个可怕的死亡。
"abcdef"
和"ddd"
是字符串文字,可以驻留在地址空间的只读部分。 char s[] = "ddd"
确保将此文字复制到堆栈 – 因此它是可修改的。
char * f = "abcdef";
定义一个指向“abcdef”的char指针,该指针位于只读区域,因此您无法写入此位置
char s[] = "ddd";
在堆栈上定义一个可写的char数组。
在第一个示例中,您有一个指向字符串文字的指针。 这个指针实际上应该是const char *
,因为任何修改字符串文字的尝试都是未定义的行为。 但是,由于遗留原因,您可以使用char *
指向它。 但你仍然不应该试图修改它。
在第二个版本中,您有一个bog标准数组,其内容恰好初始化为等同于您的字符串。 这是可以修改的,因为它是你的arrays。
第一个例子是字符文字的字母char *
(文字是"something"
)。 字符文字是只读的,尝试写入它们可能会导致崩溃。 你的第一个指针应该是const char *f = "abcdef";
, strcpy
不会采取。
语句char * f = "abcdef"
将内存中的一个点分配给文字字符串“abcdef”,但是它会拒绝让你修改它的内容,直到内存被动态分配 – 它等同于一个const char
。
您所做的只是在内存中创建指针,然后在接下来的6个字节上写入,这在C中是非法的。
大多数编译器都认为字符串文字是只读的,因此它们所在的内存可以标记为只读,从而导致运行时错误。
要使其工作,请执行以下操作:
char * f = strdup("abcdef"); strcpy(f, "abcdef"); printf("%s",f); free(f);
这会在堆内存中创建一个可修改的字符串副本,当然需要在程序结束时释放它。
你,请参考这个
链接,关于如何使用strcpy作为char指针。
请参阅字符串文字:它们去哪里了?