有关C语言中数组初始化问题

“只有在定义数组的时候才能{...}对全部元素初始化,例如:inta[3]={0,1,2};。其他情况下只能一个一个元素赋值,如a[4][0]=1;。”这句话对吗?因为我... “只有在定义数组的时候才能{ ... }对全部元素初始化,例如:int a[3]={0,1,2};。其他情况下只能一个一个元素赋值,如a[4][0]=1;。”这句话对吗?因为我在定义了一个包含一个二维数组的结构,在初始化结构时用“{ ... }对全部元素初始化”的方法出错,不会只能一个个赋值初始化吧,我那个数组是10行10列的,一个个赋值不实际啊 展开
 我来答
枫叶非也
2014-07-06 · 超过34用户采纳过TA的回答
知道答主
回答量:63
采纳率:0%
帮助的人:67.6万
展开全部
这样赋值肯定出错。
一个简单的办法就是,你可以再定义一个和你邻接矩阵相同的矩阵在初始化函数中。比如,tmp_mat[SIZE][SIZE] ={...}
再G->linkArray = tmp_mat;就行了。

如果你觉得这样比较浪费空间,可以将结构体中的linkArray改为二级整形指针,在初始化的时候,指向一个初始化好的矩阵。
追问

谢谢你的回答,我还有一点疑问:

  1. 为什么不能这样赋值?

  2. 你的想法非常赞,你看是不是这样改,但还是有点问题:


追答

实在抱歉,昨天回答的有点着急。这个赋值没说清楚。

直接赋值是不行,回报左右类型不一致的错误。

因为你的二维数组是给定长度的,所以很好办。

参照我一下的代码就行了。

(为了方便验证,我只用了你矩阵的第一行,

然后复制了10行,注意修改成你要的矩阵。【十行都粘出来就超出回答字数了……晕】)


如果还有问题,可以继续追问。


P.S.

“只有在定义数组的时候才能{ ... }对全部元素初始化,例如:int a[3]={0,1,2};。其他情况下只能一个一个元素赋值,如a[4][0]=1;。”

这句话是对的。只能在数组初始化的时候,使用大括号进行复制。如果没有进行初始化,编译器会用默认值初始化这个数组,这个数组就相当与声明了,在后面想要再赋值只能取下标赋值。编译器要对你的代码进行解析,所以这是编译器来决定的(有兴趣可以看看《编译原理》)。

#include <stdio.h>
#include <string.h>

#define SIZE 10

typedef struct {
  // ...
  int linkArray[SIZE][SIZE];
  // ...
} Graph;

void create_graph(Graph *G) {
  int temp[][SIZE] = {
    {0, 1, 0, 0, 0, 0, 0, 1, 0, 0}
     //...
  };
  //使用memcpy对两个二维数组进行拷贝。函数详细信息可以百度下
  memcpy(G->linkArray, temp, sizeof(int)*SIZE*SIZE);
}

int main() {
// use init function
  Graph G;
  int i, j;
  //memset可以对二维数据进行初始化赋值,这里可以将G.linkArray中的元素都置为0
//  memset(G.linkArray, 0, sizeof(int) * SIZE * SIZE);
  create_graph(&G);
// ...
  return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
米饭亦是菜肴啊
2014-07-06 · 超过23用户采纳过TA的回答
知道答主
回答量:90
采纳率:0%
帮助的人:45.8万
展开全部
linkArray[SIZE][SIZE] = ... 第一个中括号也填上的话应该不会出错了
追问
其实可以不填的,但我填上后还是报错。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式