当前正在读取K&然后才偶然发现了char指针.在《rn》一书中定义字符指针时,没有关于内存分配的内容,也许稍后会解释.但这根本没有意义,所以我正在寻求帮助:)

1

// No errors
char *name;
char *altname;
strcpy(altname,name);

2

// No errors, internals of *name have been successfully moved to *altname
char *name = "HI";
char *altname;
strcpy(altname, name);

3

// Segmentation fault, regardless of how I define *altname
char *name = "HI";
char *altname = "randomstring";
strcpy(altname, name);

4

// Segmentation fault, regardless of how I define *altname
char *name;
char *altname = "     ";
strcpy(altname, name);

5

// copies internals of *name only if size of char s[] > 8???
char s[9];
char n[] = {'c', 'b'};
char *name = n;
char *altname = s;
strcpy(altname, name);

为什么第一个示例即使没有分配内存,也不会产生错误?

为什么第二个成功地将name复制到altname,即使没有为altname分配内存;

为什么第三个和第四个单芯转储?

为什么第五个要求s的大小为>8.

推荐答案

我有点惊讶,前两个例子奏效了.strcpy获取第二个参数所指向的字符数组,并将其复制到第一个参数所指向的字符array.

在第一个示例中,指针namealtname没有指向任何东西.它们是未初始化的指针.现在,它们有了一些价值,要么是基于main函数执行时内存中的任何黏液,要么就是编译器决定如何初始化它们.这就是为什么我对你的代码没有崩溃感到惊讶.

无论如何,第三个示例之所以使用segfaulting,是因为您将两个指针都设置为指向字符串文字(即"HI""randomstring").字符串文字(很可能)存储在内存的只读部分中.因此,当您在目标指针设置为altname的情况下运行strcpy时,您试图写入只读内存.这是对内存的无效使用,因此导致了崩溃.第四个例子也是如此.

在最后一个示例中,您的问题是n不是以null结尾的.strcpy一直复制字符,直到到达终止符(即'\0').您在数组中放置了'c''b',但没有终结者.因此,strcpy将继续复制,即使它达到n的末尾.它在sizeof(s)大于8时工作的事实可能涉及堆栈上存在空字节happens的位置.也就是说,如果将s设置得太小,则会写入到s的末尾,并损坏堆栈上的内存.在执行完函数后,可能会重写返回指针,从而返回到某个无效的内存地址.

您需要做的是使用数组,而不是使用指针.这将在内存的可写部分中为您提供所需的存储空间.您还需要确保数组以null结尾.这可以通过使用字符串文本初始化数组来自动完成.

char name[] = "HI";
char altname[] = "randomstring";
strcpy(altname, name);
char s[3]; // Enough space to hold "cb" plus a null-terminator.
char n[] = "cb";
char *name = n;
char *altname = s;
strcpy(altname, name);

C++相关问答推荐

如何在C中通过转换为char * 来访问float的字节表示?

为什么listen()(在调用accept()之前)足以让应用程序完成3次握手?

C如何显示字符串数组中的第一个字母

ESP32在vTaskDelay上崩溃

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

CC2538裸机项目编译但不起作用

在每种If-Else情况下执行语句的最佳方式

我在反转双向链表时遇到问题

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

覆盖读取函数,但当文件描述符为3或4时,我有问题

C语言中MPI发送接收字符串时出现的分段错误

不带Malloc的链表

try 查找带有指针的数组的最小值和最大值

计算SIZE_MAX元素的长数组的大小

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

Linux memcpy 限制关键字语法

无法在线程内用 C 打印?

C99 的 %zu 格式说明符不起作用

Zig 中 C 的system函数的惯用替代方案