shell C中的动态分配和分段错误
如果需要,我想为line、argv和realloc动态分配内存,但这样做会出错: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); 结果在没有强
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