realloc()时指针无效

时间:2015-05-12 20:59:28

标签: c realloc

来电者功能:

void caller_func(){
    char *c = malloc(strlen("Hi") + 1);
    c = "Hi"; //c is a pointer char*
    char **s = &oi; //s is a pointer to a pointer: char **;
    called_func(s, 3, 'A');
}

调用函数

void called_func(char **s, int p, char c){
        char *w = *s; //w = oi ?!
        size_t len = strlen(w);
        if(w[p] == '\0'){
           w = realloc(w, len+1); // ERROR HERE. INVALID POINTER
        }  
    }

我知道我应该使用临时变量。这样,如果realloc失败,我仍然释放原始值。这只是一个考验 它给了我Invalid Pointer 0x0000232***错误。

2 个答案:

答案 0 :(得分:4)

char *c = malloc(strlen("Hi") + 1);

您分配3个字节。

c = "Ola"; //c is a pointer char*

您将c更改为指向其他位置并丢失之前分配的内容。阅读 strcpy

“Ola”(带有空终止符)也不适合3字节的缓冲区。

答案 1 :(得分:0)

执行以下操作:

strcpy(c, "Hi"); // Instead of c = "Hi". Using strcpy() you are copying into   

                 // the memory allocated via malloc().

realloc()现在将按预期工作,因为'w'现在将指向

最初通过malloc()分配的内存。

(如果它让你感到困惑就把它画在纸上......你会很快注意到c =“嗨”之后'c'如何指向不同的位置;)