【问题标题】:Invalid Pointer while realloc()realloc() 时指针无效
【发布时间】:2015-05-12 20:59:27
【问题描述】:

调用函数:

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
        }  
    }

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

【问题讨论】:

  • 1.分配给变量时,您会更改其值。 2. 因此,当您分配给指针时,您会更改其值。 3. 但是指针的值是地址。它是指针指向的内存地址。 4. 所以当你分配一个指针时,你改变了它指向的地址。 5.c是一个指针。当您分配给c(即您对c = 进行任何操作)时,它会停止指向之前指向的内容,并开始指向您分配给它的新地址。所以,c = "Hi" 使它指向一个新地址,而不是之前指向的地址。
  • 您知道我们甚至不知道oi 是什么,不是吗?所以整个sn-p都是废话。总的来说,你不必分配内存,让一个指针指向它,然后让指针指向一个字符串文字,什么是有效的让你使用分配的内存块的轨道。
  • 另外:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括期望的行为、特定的问题或错误以及最短的在问题本身中重现它所必需的代码没有明确的问题陈述的问题对其他读者没有用处。 -> 我无法从那个 sn-p 重现错误。我只能看到其他错误/失败。所以这是题外话。

标签: c realloc


【解决方案1】:
char *c = malloc(strlen("Hi") + 1);

你分配了 3 个字节。

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

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

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

【讨论】:

  • 我现在测试一下。 *c = "..." 会有什么不同吗?工作。谢谢
  • 是的,但它不会达到您的预期。 (它只是复制 'O'),使用 strcpy 或 strdup
  • c 是 char * 类型。 “废话”是 char * 类型。 *c 是 char 类型,因此它显然不能接受“废话”。我已经说过你应该使用 strcpy。现在我还建议您阅读有关 C 语言的书。
【解决方案2】:

执行以下操作:

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

                 // the memory allocated via malloc().

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

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

(如果让您感到困惑,请在纸上画出来......您会很快注意到在您执行 c = "Hi"; 后 'c' 指向不同的位置;)

【讨论】:

  • 在纸上画什么?它应该如何提供帮助?
  • 那条评论为什么让人困惑?使用钢笔/铅笔和纸并将其“映射”出来......他的功能中有多个指针和指向指针等的指针......在纸上写下东西可以帮助消除混乱。是我说的“在纸上画”还是 bcos 我回答的内容没有用......?
  • 反对票是,因为我们不知道oi 是什么,我们只能猜测它与c 有联系,所以总的来说我们可以猜测为什么realloc() 失败。但总的来说,我们绝对无法将其解决为所述错误的根源,即您所声称的。这就是为什么-1。笔和纸对 INMHO 没有用,因为要画下来,您必须了解幕后发生的事情才能正确执行。而如果他能够做到这一点,他可能甚至不需要问他的sn-p有什么问题。在我看来,总体来说没用。
  • 你错过了重点,在这里分叉了。关键是提供一些反馈,他可以用来解决他的问题。在缺乏某些信息的情况下,可以对他试图询问的内容做出合理的假设,并给出适当的回应来帮助他。然后他有责任阅读答案并适当地使用提供的信息。
  • 这就是评论的用途。无论如何:如果您在使用 strcpy() 后没有声称 realloc WILL 工作,我不会投反对票,因为您根本不知道。即使它看起来很明显。
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 2013-03-21
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 2019-08-15
相关资源
最近更新 更多