typedef struct node {
struct node* next;
int hash;
symbol_t symbol;
} node_t;
typedef struct symbol {
char* name;
int addr;
} symbol_t;
上面是我正在使用的两个结构的定义。我正在尝试将新的node_t 添加到链接列表中。首先,我为node_t分配内存:
node_t* newSymbol = malloc(sizeof(node_t));
然后,node_t 应该包含一个嵌套结构(符号)。我尝试修改 node_t 中符号结构内的名称属性(字符串):
newSymbol->symbol.name = name;//name is a parameter to function I'm in
我尝试初始化符号嵌套结构内部的名称和地址;但是,我收到此错误:
warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] newSymbol->symbol.name = name;
^
我尝试了多种方法来修改嵌套符号结构中的数据,但它要么引发上面列出的错误,要么导致段错误。我不确定我做错了什么。预先感谢您的帮助。
最佳答案
name
可能是一个 const char*
,symbol->name
是一个非常量,所以警告告诉你,通过这样做newSymbol->symbol.name = name;
您正在丢弃 const
属性,这可能不是您想要的,因为 name
可能是指向只读内存(如字符串文字)。
这很糟糕,因为如果你以后做这样的事情:
newSymbol->symbol.name[0] = toupper(newSymbol->symbol.name[0]);
如果 newSymbol->symbol
指向一个,这可能会导致未定义的行为
只读位置。
请注意
const char *txt = "Hello";
*txt = 'A';
由于const
,会给你一个错误。
解决这个问题的方法是 coderredoc 提到的:使用 malloc
+
strcpy
或 strdup
(如果可用)。
newSymbol->symbol.name = strdup(name);
if(newSymbol->symbol.name == NULL)
{
// error handling
}
或者如果 strdup
不可用:
newSymbol->symbol.name = malloc(strlen(name) + 1);
if(newSymbol->symbol.name == NULL)
{
// error handling
}
strcpy(newSymbol->symbol.name, name);
当你有一个像这样的函数
void foo(const char *name);
这也暗示函数 foo
不会修改指向的内容
通过 name
,因此执行 foo("stringliteral");
是安全的。因为你不能
假设 name
指向可修改的内存,最好进行复制。
关于c - 使用C修改嵌套结构的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48728142/