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

时间:2017-06-06 13:16:07

标签: c c-strings strcpy

我在这里和德国人很新,所以请原谅我的英语不好。 作为学校练习的一部分,我们应该在基于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是一个注释,因为该程序立即停止工作。 谢谢你的帮助, 亚历

1 个答案:

答案 0 :(得分:1)

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

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

结果你有一个resp是一个char *,分配大小为1.虽然strcpy至少需要2的大小 - 一个用于“”,你复制一个用于“\ 0” - 字符串终止字符。这就是为什么当你尝试将长度为2的长度为1的 resp 时你的应用程序崩溃的原因 - 你试图写入你不拥有的内存。

而不是:

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

您也应该使用strcpy。我建议遵循:

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

<强> 2。阅读您对新手所使用的功能的文档,例如strcpy。它包含一些有价值的信息,如:

  

为避免溢出,目标指向的数组大小应为   足够长以包含与源相同的C字符串(包括   终止空字符),并且不应与内存重叠   源。

第3。了解调试 - imho,这是最重要的事情之一! 例如,this link描述了内存分配和调试技术的一些要点。

这一切都可以让你的生活更轻松:)