2016-10-05 45 views
3

我想知道如何将包含一个int数组的结构赋值给一个结构数组。无论我想到什么新的解决方案,我都会得到不正确的结果。如何正确地将包含int数组的结构赋值给一个struct数组?

我认为问题就出在这一段代码:

struct Codes *create(int as) { 
    struct Codes *c = malloc(sizeof (struct Codes)+as * sizeof (int)); 
    c->as = as; 
    for (int i = 0; i < as; i++) { 
     c->a[i] = i; 
    } 

    return c; 
} 

整个代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

struct Codes { 
    int as; 
    int a[]; 
}; 

struct Code { 
    int as; 
    struct Codes *ci[]; 
}; 

struct Codes *create(int as) { 
    struct Codes *c = malloc(sizeof (struct Codes)+as * sizeof (int)); 
    c->as = as; 
    for (int i = 0; i < as; i++) { 
     c->a[i] = i; 
    } 

    return c; 
} 

struct Code *and(int as, struct Codes *cd) { 
    struct Code *c = malloc(sizeof (struct Code)+as * sizeof (struct Codes)); 
    for (int i = 0; i < as; i++) { 
     c->ci[i] = cd; 
    } 
    c->as = as; 
    return c; 
} 

int main(int argc, char **argv) { 

    struct Codes *cd; 
    cd = create(4); 

    struct Code *c; 
    c = and(2, cd); 

    for (int i = 0; i < c->as; i += 1) { 
     for (int j=0; j < c->ci[i]->as; j++) { 
      printf("%d \n", c->ci[i]->a[j]); 
     } 
    } 

    free(cd); 
    free(c); 

}//main 

实际结果:

0 
1 
2 
3 

预期结果:

0 
1 
2 
3 
0 
1 
2 
3 
+1

学习如何使用调试器并能够在程序运行时通过检查变量的值来自己找到这些东西是件好事 –

+0

对不起,我不知道我是如何搞砸的,谢谢寻求帮助。 –

回答

1

struct Code *c = malloc(sizeof (struct Code)+as * sizeof (struct Codes));不正确。 struct Code的ci是一个指针数组,但是你为一个数组结构分配了空间。

为了解决这个问题,要么改变对sizeof(struct Codes *),或者最好使用解引用指针你分配空间的类型的模式:

struct Code *c = malloc(sizeof *c + as * sizeof c->ci[0]); 

此外,for (int j;应该for (int j = 0;。您的代码通过使用未初始化的值j导致未定义的行为,这只是偶然得到您所做的输出。使用gcc标志-Wextra会诊断出这个错误。

相关问题