,我想为行和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
...
}
但是按照惯例,argc
和argv
用于当前程序的参数,因此您应该使用另一个名称,例如 cmd_argv
.