壳 C 中的动态分配和分段故障


如果需要

,我想为行和argv和realloc动态分配内存,但是当我这样做时出现错误:

char* argv = malloc(sizeof(char)*BUFFER);赋值使指针成为整数,而无需在 strcmp 等许多行中强制转换。错误日志:https://i.stack.imgur.com/UopWE.jpg

此外,我希望当有人按 ENTER 键时,它只打印 $(空格),但我得到代码的分段错误(核心转储)或不scanf("%s",line); if(line == "n") printf("$ ");

提前谢谢。

如果这个

char* argv = malloc(sizeof(char)*BUFFER);

赋值中的结果使整数从指针没有强制转换警告,您正在编译的实际代码可能会错过

#include <stdlib.h>

指令。 GCC 仍然实现隐式函数定义(早已从 C 标准中删除),因此它会自动提供如下malloc声明:

int malloc();

但是这个定义在 64 位架构上是无用的,因为它会裁剪到指针值的上 32 位(将返回值转换回 char * 不会恢复它们)。

当前版本的 GCC 将警告缺少malloc声明。 您确实应该使用 -Wall 进行编译以获得此警告(默认情况下,旧 GCC 版本未启用它)。

在当前代码中,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 .

相关内容

  • 没有找到相关文章