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

时间:2019-06-11 00:10:16

标签: c pointers

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

2 个答案:

答案 0 :(得分:3)

此代码:

string = argv[1];

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

相反,您应该这样做:

strcpy(string, argv[1]);

答案 1 :(得分:3)

您分配了空间并分配了shell_exec('cd C:\path\to\file'); shell_exec('start .'); 指向它:

string

然后,用存储在 string = malloc((strlen(argv[1]) + 1) * sizeof(char)); // + 1 for \0 中的指针的副本替换该指针

argv[1]

从而泄漏了分配的内存,并使 string = argv[1]; 指向程序未分配的空间。因此string失败是很自然的,因为其指针参数必须是指向已分配块开头的有效指针。错误消息就在这里。

看起来不是要泄漏分配的内存,而是要复制realloc()的内容到其中。而不是(指针的)赋值,应该是

argv[1]