【问题标题】:如何memset初始化结构参数之一
【发布时间】:2022-01-23 16:47:40
【问题描述】:

我可以为节点参数初始化所有内存,现在我只想初始化一个结构参数(node-> nb),但是有错误

我的代码

#define v 10

typedef struct node_type{
    int id;
    int nb[v];
    bool link_capacity;
}node_t;

int main()
{
    int i,j;
    
    node_t *node;
    node = (node_t *) malloc(v*sizeof(node_t));
    memset(node, 0, v*sizeof(node_t));
    
    node[0].nb[0]=1;
    node[1].nb[0]=2;
    node[0].id=1;
    node[1].id=2;

    printf("%d %d %d %d\n",node[0].nb[0],node[1].nb[0],node[0].id,node[1].id);

    memset(node->nb, 0, v*sizeof(node_t));
    
    printf("%d %d %d %d\n",node[0].nb[0],node[1].nb[0],node[0].id,node[1].id);
    return 0;
}
Ans: 
1 2 1 2
0 0 1 0

But I hope that Ans:
1 2 1 2
0 0 1 2

如何修改?

【问题讨论】:

  • 不要从 malloc 中强制返回,见stackoverflow.com/questions/605845/…
  • 什么是path
  • 哦,路径错误。
  • 您可以将node = malloc(v*sizeof(node_t)); memset(node, 0, v*sizeof(node_t)); 替换为calloc( v, sizeof(*node)); 请注意,我还将sizeof(node_t) 替换为sizeof(*node),因此大小始终与指针变量本身直接相关。

标签: c struct


【解决方案1】:

你为什么将 node_t 的大小设为 10 倍

memset(node->nb, 0, v*sizeof(node_t)); ?

要将 nb 数组归零,请使用

memset(node[0].nb, 0, sizeof(node[0].nb));

如果您想清除所有此类数组,则需要遍历 node[i].nb

【讨论】:

  • 感谢您的回复。那么 node[i] 那不能直接清除吗?必须使用循环吗?
  • @guanting.lai 是的,你需要一个循环,因为 nb[i] 数组在内存中并不相邻。 for(int i = 0; i < v; ++i) memset(node[i].nb, 0, sizeof(node[0].nb));
猜你喜欢
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多