gpt4 book ai didi

c - 为什么在使用 strncpy 时会出现段错误?

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

我在使用 strncpy 和 (pointer-to-struct)->(member) 表示法时遇到段错误:

我已经简化了我的代码。我初始化一个结构并将其所有标记设置为空字符串。然后声明一个指向结构的指针并将结构的地址分配给它。

我将指针传递给一个函数。我可以在函数的开头打印出结构的内容,但是如果我尝试在 strncpy 函数中使用 tp -> mnemonic,我会遇到段错误。谁能告诉我我做错了什么?

typedef struct tok  {
char* label;
char* mnem;
char* operand;
}Tokens;

Tokens* tokenise(Tokens* tp, char* line) {
// This prints "load"
printf("Print this - %s\n", tp -> mnem);

// This function gives me segmentation fault
strncpy(tp -> mnem, line, 4);

return tp;
}

int main() {
char* line = "This is a line";
Tokens tokens;
tokens.label = "";
tokens.mnem = "load";
tokens.operand = "";

Tokens* tp = &tokens;
tp = tokenise(tp, line);

return 0;
}

我已经使用 printf 语句来确认代码确实在 strncpy 函数处停止执行。

最佳答案

问题在于 tp->mnem 指向的是一个字符串字面量,它通常分配在只读内存段中。因此覆盖它是非法的。很可能您需要做的是这样的事情:

Tokens tokens;
tokens.label = "";
tokens.mnem = strdup("load");
tokens.operand = "";

这将为您提供一个为 mnem 动态分配的内存块,然后您可以向其中写入任意多的内容。当然,您还有其他一些问题:首先,您需要记住稍后使用 free 释放该内存;其次,您必须了解已分配的缓冲区大小,以免覆盖它。

如果您知道 mnem 的内容永远不会超过 4 个字节,那么您可能会像这样更改您的结构声明:

typedef struct tok  {
char* label;
char mnem[5]; // note: +1 byte for a NULL terminator
char* operand;
}Tokens;

然后,你会像这样初始化它:

Tokens tokens;
tokens.label = "";
strcpy(tokens.mnem, "load");
tokens.operand = "";

这减轻了您为 mnem 管理内存的责任,尽管您仍然有一些溢出缓冲区的风险。

关于c - 为什么在使用 strncpy 时会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2593814/

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