gpt4 book ai didi

使用 char* 时的 C 怪异行为

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:55 25 4
gpt4 key购买 nike

我有这个功能

Function *function_get_by_label(char *label_name) {     
int new_len = strlen(label_name) - 9;
char* name = malloc(sizeof(char) * new_len);
for (int i = 0; i < new_len; i++) {
name[i] = label_name[i];
}

return function_get(name);
}

但是,当我尝试用 gdb 调试这个时,比如显示 name 变量,我得到以下信息

(gdb) display name
1: name = 0x610120 ""
(gdb) n
1: name = 0x610120 ""
1: name = 0x610120 "m"
1: name = 0x610120 "m"
1: name = 0x610120 "mu"
1: name = 0x610120 "mu"
1: name = 0x610120 "mul"
1: name = 0x610120 "mul"
1: name = 0x610120 "mult"
1: name = 0x610120 "mult"
1: name = 0x610120 "multi"
1: name = 0x610120 "multi"
1: name = 0x610120 "multip"
1: name = 0x610120 "multip"
1: name = 0x610120 "multipl"
1: name = 0x610120 "multipl"
1: name = 0x610120 "multiply2_function"

怎么可能有这么奇怪的行为?我试图操纵这些 mallocs。我还尝试重写该函数,以便我可以举例说明如何重现它,但没有成功。

更奇怪的是,当我将 malloc 中的分配空间更改为 sizeof(char) * 99 时,结果是

(gdb) display name
1: name = 0x60f120 ""
(gdb) n
1: name = 0x60f120 ""
1: name = 0x60f120 "m"
1: name = 0x60f120 "m"
1: name = 0x60f120 "mu"
1: name = 0x60f120 "mu"
1: name = 0x60f120 "mul"
1: name = 0x60f120 "mul"
1: name = 0x60f120 "mult"
1: name = 0x60f120 "mult"
1: name = 0x60f120 "multi"
1: name = 0x60f120 "multi"
1: name = 0x60f120 "multip"
1: name = 0x60f120 "multip"
1: name = 0x60f120 "multipl"
1: name = 0x60f120 "multipl"
1: name = 0x60f120 "multiplyltiply2_function"

最佳答案

您将字符串 label_name 复制到一个短了 9 个字符的新变量 name。您复制所有字符减去最后 9 个字符。

此时,name 是一个未终止的 C 字符串,它的所有存储空间都已被使用。在机器的内存中,name之后会有更多的内存,但它不是你的,可以有任何数据。事实上,在你复制了最后一个字符之后(你的 malloced 内存纯属偶然归零),你会看到 not-your-memory 中的内容。

您将 name 传递给函数 function_get,但是该函数不知道 name 的长度。如果它打印它,它可以正确地打印 name,或者可以打印它之后的任何数据,直到它遇到一个空字符(如果它遇到一个;你不知道那里有什么)。这就是所谓的未定义行为

当您使用 malloc 分配 99 个字符时,您说它仍然显示“奇怪的行为”。事实上,因为 malloc 没有初始化内存,所以内存中可能有任何数据。虽然内存现在是你的了(最多 99 个字符),你仍然没有用 \0 字符终止字符串,你仍然有未定义的行为

经验教训: \0!! 终止你的字符串

关于使用 char* 时的 C 怪异行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47415355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com