c - 使用C修改嵌套结构的数据

标签 c pointers struct

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 + strcpystrdup(如果可用)。

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/

相关文章:

检查每个数字是否可以被 2 整除

c - 在这种情况下,数组索引中的字符表示如何工作?

C - 读取十六进制数并检查是否小于零 scanf()

c++ - 重新检查时指针属性发生变化

在 C 中不使用 strcpy 将字符指针复制到另一个字符指针

c - 如何设置结构体的字符串属性?

arrays - 在 Go 中,如何将结构转换为字节数组?

c - 为什么带有 DBL_MIN 的 strtod() 给出 ERANGE?

c - 双链表和void指针【find方法】

arrays - Coldfusion 中的 Foreach() array.each()...数组和结构向后?是什么赋予了?