【问题标题】:Filling an int Array inside a Structure在结构中填充 int 数组
【发布时间】:2015-12-16 01:23:06
【问题描述】:

所以,我想知道结构内部数组的初始化。如果我把它放在主要功能之上:

typedef struct{
int day[7];
} WEEK;

void initTest(WEEK week, int seven) {
  int i;
  for(i=0; i<seven; i++){
        week.day[i] = i + 1;
  }
}

.. 似乎不起作用,通过像这样在 main 中调用它:

WEEK week;
initTest(week, 7);

我从填充到我的数组的内存中提取了一些垃圾值。

但是,如果我直接在主函数中使用以下内容

int i;
for(i=0; i<7; i++){
        week.day[i] = i + 1;
}

..我得到了很好的Array (1.. to ..7) 归档。

有人能解释一下为什么会发生这种情况,并可能给出一些示例或替代方法来解决这个问题(使用指针/malloc 或其他方式)等吗?

【问题讨论】:

  • 您希望void f(int i) {i = 5;} int main() {int x = 7; f(x); printf("%d\n", x); return 0;} 打印什么?
  • void 什么都不做(没有返回值),所以 main 打印出 7!顺便提一句。我尝试了第一次尝试在结构中填充数组的方式来归档结构成员,并且它以某种方式工作:typedef struct{ int day; } WEEK; void initTest(WEEK week) { int i; for(i=0; i&lt;7; i++){ week[i].day = i + 1; } } ..所以基本上定义了一个包含 7 个主要结构的数组,例如:WEEK week1[7]; initTest(week1) 工作方式有所不同,因为它填充值好吗?
  • int f(int i) {i = 5; return i;} int main() {int x = 7; f(x); printf("%d\n", x); return 0;} 呢?
  • 函数 f 的返回值为 5,但它对 Action 没有任何作用。所以 7 将打印在控制台中。如果我们使用printf("%d\n", f(x));,控制台输出将为 5。
  • 正如您在每本优秀的 C 书籍或教程中看到的那样,C 是按值调用的。

标签: c arrays struct initialization int


【解决方案1】:

initTest() 收到了week 的副本。调用函数的week 没有改变。而是让调用代码和接收代码使用指向week 的指针。

void initTest(WEEK *week, int seven){
  int i;
  for(i=0; i<seven; i++){
        week->day[i] = i + 1;  // ->
  }
}

WEEK week;
initTest(&week, 7);  // &week

【讨论】:

    【解决方案2】:

    修改函数中的参数不会影响调用者传递的内容。

    使用指针修改调用者的局部变量。

    void initTest(WEEK *week){
        int i;
        for(i=0; i<7; i++){
            week->day[i] = i + 1;
        }
    }
    
    WEEK week;
    initTest(&week);
    

    我删除了参数seven,因为它看起来毫无意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-20
      • 2015-09-23
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      相关资源
      最近更新 更多