2017-06-06 65 views
-3

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

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的,功能是注释,因为PROGRAMM立刻停止工作。 感谢您的帮助, 亚历

+4

你觉得'* RESP =(char)的“错误:将未成功”'将完成?该投射应该暗示您做错了事,不要盲目盲目投射,以免沉默编译器警告。 –

+0

至于你的问题,什么*是*'resp'?你传递给函数的是什么?你怎么称呼它?你能否请尝试创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们展示? –

+1

C中的参数是按值传递的,而不是引用。如果您之后立即返回,为'resp'指定一个新值是毫无意义的。你似乎对“休息”的目的是什么感到困惑。 –

回答

1

假设,即RESP应该在你的main.c你是不正确初始化一个字符串:

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

因此,你有一个resp作为一个字符*分配的大小为1.虽然strcpy需要至少为2的大小 - “”您复制一个用于“\ 0” - 字符串终止字符。这就是为什么当您尝试将长度为1的resp中的长度设置为2时,您的应用崩溃 - 您正尝试写入您不属于自己的内存。

,而不是另外:

*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.了解调试 - IMHO,这是最重要的事情之一! 例如this link描述了一些内存分配和调试技术。

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