c-在字符指针上使用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 s[] = "ddd";在堆栈上定义了一个可写的字符数组。

在第一个示例中,您有一个指向字符串文字的指针。这个指针实际上应该是const char *,因为任何修改字符串文字的尝试都是未定义的行为。然而,由于遗留的原因,您可以使用char *来指向它。但您仍然不应该试图修改它。

在第二个版本中,您有一个bog标准数组,其内容恰好被初始化为与您的字符串等效。这是可修改的,因为它是您的数组。

第一个例子是一个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);

这将在堆内存中创建一个可修改的字符串副本,当然,该副本需要在程序结束时释放。

最新更新