繁体   English   中英

为什么不能在函数的数组指针上使用realloc?

[英]Why can't I use realloc on pointer to array in function?

我希望能够将一个字符串传递给一个函数,该函数采用构成该字符串的字符数组并将其更改为提供的其他字符串。 问题是我收到一条错误消息,告诉我正在重新分配(使用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

应该发生什么:

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

这段代码:

string = argv[1];

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

相反,您应该这样做:

strcpy(string, argv[1]);

您分配了空间并分配了指向它的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]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM