shell C中的动态分配和分段错误

时间:2017-10-24 08:28:01

标签: c shell malloc

我想动态为line和argv分配内存并在需要时重新分配但是当我这样做时会出错:

char* argv = malloc(sizeof(char)*BUFFER);赋值在strcmp之类的许多行中都没有使用强制转换从指针生成整数。错误日志:https://i.imgur.com/qsYNinq.jpg

此外,当有人点击ENTER时我想要打印除$(空格)以外的任何东西但是我得到了代码错误(核心转储)和代码scanf("%s",line); if(line == "\n") printf("$ ");

提前致谢。

2 个答案:

答案 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
    ...
}

按惯例argcargv用于当前程序的参数,因此您应使用其他名称,例如cmd_argv