gpt4 book ai didi

c - 共享内存中带有 strcpy 的 BAD_ACCESS (C)

转载 作者:行者123 更新时间:2023-11-30 20:59:55 25 4
gpt4 key购买 nike

我是新来的,而且是德语,所以请原谅我的英语不好。作为学校练习的一部分,我们应该实现一个带有用于键值存储的共享内存的套接字服务器,在基于 UNIX 的系统上运行。服务器、共享内存和 fork() 正在工作。我们使用一个结构数组,并为此创建了函数(put、get、delete)。在 put 方法中,当我们复制两个字符串时,我们会得到这个 BAD_ACCESS。该方法的代码如下,我们存储库的链接在这里:Github Repo

int put(int key, char *value, char *resp){
int emptyIndex = -1;
//strcpy(resp, "");
resp = "";
for(int i = 0; i < STORELENGTH; i++){
// If the key exists, overwrite it, give back previous value, and return true
if(kv[i].key == key) {
resp = kv[i].value;
kv[i].value = value;
return 1;
}
// If the key doesn't exist, remember the empty index
if(kv[i].key == NULL){
emptyIndex = i;
}
}

// If there was an empty index, just reuse it
if(emptyIndex > -1) {
kv[emptyIndex].key = key;
resp = "";
kv[emptyIndex].value = value;
return 1;
}

*resp = (char) "Error: Put was not successful.";
return -1;
}

如您所见,strcpy-Function 是一个注释,因为程序立即停止工作。感谢您的帮助,亚历克斯

最佳答案

假设 resp 应该是 main.c 中的一个字符串,您错误地初始化了它:

char *resp = ""; <- This one is bad
//char resp[BUFSIZ]; <-- This one is good but commented.

因此,您的 resp 是分配大小为 1 的 char*。而 strcpy 需要至少 2 的大小 - 一个用于“”,您复制一个对于“\0” - 字符串终止符。这就是为什么当您尝试将长度 2 放入长度为 1 的 resp 时,您的应用会崩溃 - 您正在尝试写入不属于您的内存。

也可以代替:

*resp = (char) "Error: Put was not successful.";

您还应该使用strcpy。我建议如下:

<强>1。阅读数组和指针以更好地理解它

<强>2。如果您不熟悉您正在使用的函数,请阅读它们的文档,例如 strcpy .它包含一些有值(value)的信息,例如:

To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.

<强>3。了解调试 - 恕我直言,这是最重要的事情之一!例如this link描述了内存分配和调试技术的一些要点。

所有这些都可以让您 future 的生活更轻松:)

关于c - 共享内存中带有 strcpy 的 BAD_ACCESS (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44391072/

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