首页 > 解决方案 > 为什么我不能在函数中指向数组的指针上使用 realloc?

问题描述

我希望能够将一个字符串传递给一个函数,该函数采用形成字符串的字符数组并将其更改为提供的另一个字符串。问题是我收到一个错误,告诉我正在重新分配的指针(使用 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: * set malloc_error_break 中的断点以调试 Abort 陷阱:6

应该发生什么:

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

标签: cpointers

解决方案


这段代码:

string = argv[1];

stringchar 指针设置为指向相同的位置argv[1]

相反,您应该这样做:

strcpy(string, argv[1]);

推荐阅读