BAD_ACCESS 在共享内存中使用 strcpy (C)
BAD_ACCESS with strcpy in shared memory (C)
我是新来的德国人,所以请原谅我的英语不好。
作为学校练习的一部分,我们应该在基于 UNIX 的系统上实现一个带有键值存储共享内存的套接字服务器 运行。服务器、共享内存和 fork() 正在运行。我们使用一个结构数组,并为此创建函数(放置、获取、删除)。在 put 方法中,当我们复制两个字符串时,我们得到这个 BAD_ACCESS。
该方法的代码如下,我们存储库的 link 在这里: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。 它包含一些有价值的信息,例如:
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描述了内存分配和调试技术的一些要点。
所有这些都可以让您以后的生活更轻松:)
我是新来的德国人,所以请原谅我的英语不好。 作为学校练习的一部分,我们应该在基于 UNIX 的系统上实现一个带有键值存储共享内存的套接字服务器 运行。服务器、共享内存和 fork() 正在运行。我们使用一个结构数组,并为此创建函数(放置、获取、删除)。在 put 方法中,当我们复制两个字符串时,我们得到这个 BAD_ACCESS。 该方法的代码如下,我们存储库的 link 在这里: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。 它包含一些有价值的信息,例如:
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描述了内存分配和调试技术的一些要点。
所有这些都可以让您以后的生活更轻松:)