来电者功能:
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***
错误。
答案 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'如何指向不同的位置;)