我想动态为line和argv分配内存并在需要时重新分配但是当我这样做时会出错:
char* argv = malloc(sizeof(char)*BUFFER);
赋值在strcmp之类的许多行中都没有使用强制转换从指针生成整数。错误日志:https://i.imgur.com/qsYNinq.jpg
此外,当有人点击ENTER时我想要打印除$(空格)以外的任何东西但是我得到了代码错误(核心转储)和代码scanf("%s",line); if(line == "\n") printf("$ ");
提前致谢。
答案 0 :(得分:2)
如果这个
char* argv = malloc(sizeof(char)*BUFFER);
导致赋值从指针生成整数而没有强制转换警告,您编译的实际代码可能会错过
#include <stdlib.h>
文件开头的指令。 GCC仍然实现隐式函数定义(从C标准中删除很久),因此它会自动提供malloc
的声明:
int malloc();
但是这个定义在64位体系结构上是无用的,因为它剪切到指针值的高32位(将返回值强制转换回char *
将不会恢复它们。)
当前版本的GCC将警告malloc
缺少声明。您真的应该使用-Wall
进行编译以获得此警告(默认情况下,旧版GCC版本未启用)。
答案 1 :(得分:0)
在当前代码中,argv
是一个指针数组,但建议的代码char* argv = malloc(sizeof(char)*BUFFER);
它变成了一个字符数组。
当您稍后尝试执行argv[i]=token;
时,您尝试将指针(token
)分配给单个字符,这会导致警告赋值从指针生成整数而不使用强制转换
正确的方法是让argv
仍然是指向指针的指针:
int cmd_argc = 10;
char **argv = malloc(cmd_argc * sizeof(char *));
如果您稍后需要argv
数组中的更多参数,则可以重新分配:
cmd_argc *= 2;
if (NULL == realloc(argv, cmd_argc * sizeof(char *))) {
// memory allocation error
...
}
但按惯例,argc
和argv
用于当前程序的参数,因此您应使用其他名称,例如cmd_argv
。