c - 为什么我不能在函数中指向数组的指针上使用 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
应该发生什么:
应该为函数提供两个字符串。第一个参数是指向字符的指针,第二个是字符串文字。提供的指向字符的指针应该在主程序中可用。
解决方案
这段代码:
string = argv[1];
将string
char 指针设置为指向相同的位置argv[1]
。
相反,您应该这样做:
strcpy(string, argv[1]);
推荐阅读
- python - 在 PySpark 中枚举连续相等值的组
- sql - 是否可以在 Informix db 11.70 中拆分字符串?
- laravel - Laravel 访问控制器中的 JSON 对象
- python - 如何将非整数字符串转换为浮点数?
- laravel - 创建一个注册用户可以做的测试部分,但目前测试可以做很多次,我希望他们只能做一次
- javascript - 在 HTML/CSS/JS (StreamLabs) 中创建具有设定延迟的 FadeIn/FadeOut 动画
- javascript - React 组件输出数据库信息
- python - Apache Airflow、Papermill 和自定义内核
- java - 类不是抽象的,也不会覆盖抽象方法错误......虽然它实现了方法
- c++ - 如何告诉 Visual Studio 我的其他 .dll 文件在哪里?