gpt4 book ai didi

c - 为什么在将 malloc() 指针分配给 char* 时出现段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 01:28:23 25 4
gpt4 key购买 nike

我有一个带有两个 char* 指针的结构:

typedef struct{
char* command;
char* option;
} Command;

然后我有一个从套接字读取的函数,将数据分成两部分(命令和选项),然后填充一个结构以返回给调用者。但是,我有一次遇到段错误,我不明白为什么。

这里是我得到段错误信号的地方:

commandStruct->command = strdupa(cmd);

这里是我的变量声明:

Command* commandStruct = malloc(sizeof(Command));
char *cmd, *option;
int cmdLen, optLen;

让我感到困惑的是,这只是一个简单的作业,不应该这么难。我对 C 的细微差别非常不熟悉,所以它可能是一个更有经验的程序员可能会捕获的非常明显的东西。感谢您的帮助。

编辑:我已经调整了我的第一个 malloc 以便为不仅仅是指针腾出空间,但我仍然遇到问题。 Valgrind 提到我写了 8 个坏字节并且“地址 0x0 没有被堆栈、malloc 或(最近)释放”。为了更加透明,我将在下面粘贴整个函数的副本,以防万一。

Command* getCommand(int cfd)
{
Command* commandStruct = NULL;
char cmdStr[200];
char *cmd = NULL, *option = NULL;
int recieved, cmdLen, optLen;

commandStruct = malloc(sizeof(Command));

memset(cmdStr, '\0', sizeof(cmdStr));
memset(commandStruct, 0, sizeof(Command));



if(commandStruct == NULL)
{
fatal("sir, you malloc'd a null pointer. Memory problems?.\n");
}

if((recieved = recv(cfd, cmdStr, MAXLINE, 0)) == -1) errExit("recv");
verbosePrint(opts.v, "recv'd %u bytes: %s\n", recieved, cmdStr);

if(!strncmp(CMD_DIR, cmdStr, strlen(CMD_DIR)))
{
cmd = CMD_DIR;
option = NULL;
verbosePrint(opts.v, "set cmd to: %s\n", cmd);
}
else if(!strncmp(CMD_CHDIR, cmdStr, strlen(CMD_CHDIR)))
{
cmd = CMD_CHDIR;
option = &cmdStr[sizeof(CMD_CHDIR)];
verbosePrint(opts.v, "set cmd to: %s\n", cmd);
verbosePrint(opts.v, "set option to: %s\n", option);
}
else if(!strncmp(CMD_PWD, cmdStr, strlen(CMD_PWD)))
{
cmd = CMD_PWD;
option = NULL;
verbosePrint(opts.v, "set cmd to: %s\n", cmd);
}
else if(!strncmp(CMD_PUT, cmdStr, strlen(CMD_PUT)))
{
cmd = CMD_PUT;
option = &cmdStr[sizeof(CMD_PUT)];
verbosePrint(opts.v, "set cmd to: %s\n", cmd);
verbosePrint(opts.v, "set option to: %s\n", option);
}
else if(!strncmp(CMD_GET, cmdStr, strlen(CMD_GET)))
{
cmd = CMD_GET;
option = &cmdStr[sizeof(CMD_GET)];
verbosePrint(opts.v, "set cmd to: %s\n", cmd);
verbosePrint(opts.v, "set option to: %s\n", option);
}

commandStruct->command = strdupa(cmd);

if(option != NULL)
{
commandStruct->option = strdupa(option);
}

return commandStruct;
}

最佳答案

你的代码

Command* commandStruct = (Command*) malloc(sizeof(commandStruct));

正在分配空间。您正在分配足够的空间来存储指向命令的指针而不是命令本身。

尝试将其替换为

Command* commandStruct = malloc(sizeof(*commandStruct));

那应该给你足够的空间。您还在为要存储的字符串分配空间。考虑改用 strdup。

希望这对您有所帮助!

关于c - 为什么在将 malloc() 指针分配给 char* 时出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27337416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com