复制/分配char *指针数据

时间:2016-07-10 15:33:44

标签: c pointers

对C来说很新,我有一个对象

struct Object {
     char *request;  
}; 

我在函数中有指针

 char *req = NULL; 
 char *request = NULL;

我最终需要将req复制到请求中,以便请求具有数据,但不会受到以后对req的更改的影响。

我相信我需要按照

的顺序
if(!request){
    request = malloc(sizeof(req));
    memcpy(request, req, sizeof(*req));
}

稍后在函数中我将请求分配给对象的请求

Object->request = request; 

目前,当我尝试打印对象的请求时,我得到了

THE REQUESTED FILE IS CALLED f▒F▒

对C来说很新,我不确定我哪里出错了,任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:3)

您没有分配足够的空间。假设req指向C字符串,您需要调用strlen来查看您需要多少空间:

if(!request){
    request = malloc(strlen(req)+1);
    strcpy(request, req);
}

注意添加一个长度,它可以容纳空终止符。

答案 1 :(得分:2)

你没有为整个字符串分配足够的空间。

在指针上使用sizeof时,只能获得指针的大小,而不是指向它的数组的大小。

所以这个:

request = malloc(sizeof(req));

根据您的系统,仅为8或4个字节分配足够的空间。你需要在其他地方跟踪数组的大小,或者使用strlen(),它遍历字符串直到找到NUL字符(\0),其中所有字符串都在C结尾用。

同样,sizeof(*req)返回char的大小,始终为1个字节。同样,你不能说明整个字符串的长度。

最好的解决方法是做这样的事情:

size_t len = strlen(req) + 1; /* leave space for '\0' character */
request = malloc(len); /* allocate memory */
memcpy(request, req, len); /* copy the string */

或者,如果你不介意两次获得字符串的长度:

request = malloc(strlen(req) + 1); /* leave space for '\0' character */
strcpy(request, req); /* use strcpy() instead of memcpy(), which gets the length itself */