【问题标题】:Why can't I use realloc on pointer to array in function?为什么我不能在函数中指向数组的指针上使用 realloc?
【发布时间】:2019-10-25 08:31:41
【问题描述】:

我希望能够将一个字符串传递给一个函数,该函数采用构成字符串的字符数组并将其更改为提供的另一个字符串。问题是我收到一条错误消息,告诉我正在重新分配的指针(使用 realloc)尚未分配(使用 malloc)。

我确保函数中使用的指针与主程序中使用的指针相同,如指针打印语句所示。我试过不传入字符串 char 数组地址,而只是传入本身。这些都没有奏效。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void change(char **old_string, char *new_string);

int main(int argc, char *argv[]) {

    if (argc == 2) {
        char *string;
        string = malloc((strlen(argv[1]) + 1) * sizeof(char)); // + 1 for \0
        string = argv[1];
        printf("Pointer outside Function: %p\n", string);
        printf("String Before: %s\n", string);
        change(&string, "New String");     
        printf("String After: %s\n", string);
    } else {
        printf("Please enter a string to have changed.\n");
    }
    return 0;
}

void change(char **old_string, char *new_string) {
    printf("Pointer in Function: %p\n", *old_string);
    *old_string = realloc(*old_string, (strlen(new_string) + 1) * sizeof(char)); // + 1 for \0
    strcpy(*old_string, new_string);
}

运行时的当前结果是:

函数外部指针:0x7ffeed590c88 字符串之前:测试 函数中的指针:0x7ffeed590c88 a.out(20309,0x111496d40) malloc: * 对象 0x7ffeed590c88 的错误:未分配重新分配的指针 a.out(20309,0x111496d40) malloc: * 在 malloc_error_break 中设置断点进行调试 中止陷阱:6

应该发生什么:

应该为函数提供两个字符串。第一个参数是指向字符的指针,第二个是字符串文字。提供的字符指针应该可以在主程序中使用。

【问题讨论】:

  • 这是您的问题string = argv[1]; 您正在将指针分配给未mallocated的东西
  • 您是否确保指向您尝试重新分配的内存的指针与您分配内存时返回的指针相同?
  • 请注意,在 C 中,sizeof(char) 保证等于 1。
  • 如何调试:呵呵 realloc 崩溃。我收到一条消息说数据不是由 malloc 分配的。所以传递给 realloc 的指针一定是坏的。看看函数调用,看起来还可以。 malloc会不会有问题?检查 malloc 代码。当您查看代码中相邻的两行时,您应该会在附近的某个地方听到花里胡哨的声音,第一行 string = malloc ... 和下一行 string = something else

标签: c pointers


【解决方案1】:

这段代码:

string = argv[1];

string char 指针设置为指向argv[1] 指向的同一位置。

你应该这样做:

strcpy(string, argv[1]);

【讨论】:

    【解决方案2】:

    您分配了空间并分配了string 指向它:

            string = malloc((strlen(argv[1]) + 1) * sizeof(char)); // + 1 for \0
    

    然后,您用存储在argv[1] 中的指针副本替换了该指针

            string = argv[1];
    

    从而泄漏分配的内存并使string 指向您的程序未分配的空间。因此,realloc() 失败是很自然的,因为它的指针参数必须是指向已分配块开头的有效指针。错误信息就在这里。

    看起来不是泄漏分配的内存,而是将argv[1] 的内容复制到其中。而不是赋值(指针的),那将是

            strcpy(string, argv[1]);
    

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 2017-10-21
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 2018-01-22
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多