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

shell C中的动态分配和分段错误,c,shell,malloc,C,Shell,Malloc,如果需要,我想为line、argv和realloc动态分配内存,但这样做会出错: char*argv=malloc(sizeof(char)*缓冲区)赋值从指针生成整数,而无需在许多行(如strcmp)中强制转换。错误日志: 另外,我希望当有人点击回车时,它只打印$(空格),但我的代码有分段错误(核心转储),或者不scanf(“%s”,行);如果(行==“\n”)printf($” 提前感谢。如果 char* argv = malloc(sizeof(char)*BUFFER); 结果在没有强

如果需要,我想为line、argv和realloc动态分配内存,但这样做会出错:

char*argv=malloc(sizeof(char)*缓冲区)赋值从指针生成整数,而无需在许多行(如strcmp)中强制转换。错误日志:

另外,我希望当有人点击回车时,它只打印$(空格),但我的代码有分段错误(核心转储),或者不
scanf(“%s”,行);如果(行==“\n”)printf($”

提前感谢。

如果

char* argv = malloc(sizeof(char)*BUFFER);
结果在没有强制转换警告的情况下,赋值从指针生成整数,您正在编译的实际代码可能会错过

#include <stdlib.h>
但是这个is定义在64位体系结构上是无用的,因为它将指针值的上32位剪辑(将返回值转换回
char*
将不会恢复它们)

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

如果

char* argv = malloc(sizeof(char)*BUFFER);
结果在没有强制转换警告的情况下,赋值从指针生成整数,您正在编译的实际代码可能会错过

#include <stdlib.h>
但是这个is定义在64位体系结构上是无用的,因为它将指针值的上32位剪辑(将返回值转换回
char*
将不会恢复它们)


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

在当前代码中,
argv
是一个指针数组,但它是建议的代码
char*argv=malloc(sizeof(char)*BUFFER)它变成一个字符数组

当您稍后尝试执行
argv[i]=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

在当前代码中,
argv
是指针数组,但它是建议的代码
char*argv=malloc(sizeof(char)*BUFFER)它变成一个字符数组

当您稍后尝试执行
argv[i]=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

argv
应该是
main
的参数。带有参数的
main
的常用函数头是
intmain(intargc,char**argv)
或等效的
intmain(intargc,char*argv[])
如果这不是您想要做的,请给
argv
另一个名称。每当我看到一个名为
argv
的变量时,我希望它能像我写的那样被声明,因为这是惯例。@Δημήτρηρηςαλάνης似乎不是这个声明char*argv=malloc(sizeof(char)*BUFFER);这会引发错误。在代码的某些部分,您试图使用类似argv[i]的东西,并将其与字符串进行比较并且仍然会得到分段错误@Δημήτρημςαλμάνης您显示了不相关的代码。显示使用动态分配声明的代码。
argv
应该是
main
的参数。
main
的常用函数头是
int main(int argc,char**argv)
或等效的
int main(int argc,char*argv[])
如果这不是你想要做的,给
argv
另一个名字。每当我看到一个名为
argv
的变量时,我希望它像我写的那样被声明,因为这是惯例。@Δημήτρηηηςαλάνηης似乎不是这个声明char*argv=malloc(sizeof(char)*BUFFER);调用错误。在代码的某些部分,您试图使用类似argv[i]的内容,并将其与字符串进行比较。我使用了int main(int argc,char*argv1[])并且仍然得到分段错误@Δημήτρηςαλάνης你显示了不相关的代码。显示使用动态分配声明的代码。它在错误消息中显示
arg
,而不是
argv
,就像你发布的代码一样。我更改了它,因此它与main不同。我将编辑我的帖子。请仔细检查t你的代码中实际上有
char*arg[50];
,而不是
char-arg[50];
。它在错误消息中显示
arg
,而不是
argv
,就像你发布的代码一样。我更改了它,因此它与main不同。我将编辑我的帖子。请仔细检查你是否确实有
char*arg[50];
在您的代码中,而不是
char arg[50];
取而代之。char**arg=malloc(sizeof(char)*BUFFER)工作了!如果用户类型输入另一行并显示提示,我如何实现这一点。当我按enter键时,它表示分段错误(内核转储).@Δημήτρημήτρηςαλμάνηη:问一个新问题,问题的确切代码是导致错误的,只需引用这个问题。char**arg=malloc(sizeof(char)*BUFFER)有效!如果用户类型输入另一个lin