c - 从 C 中的结构打印 int 数组

标签 c

<分区>

我正在尝试从文件中读取结构,然后显示(和排序)和数组。我遇到了麻烦,但我认为这与我没有访问正确的内存有关。当我打印数组时,它以大量随机数的形式出现。

struct details
{
    int numberOfPresents;
    int numberOfBuildings;
    int buildings[];
};

void print_int_array(const int *array) 
{ 
    for(int i=0; i<200; i++) 
        printf("%d | ", array[i]);

    putchar('\n');
} 

void sort(int buildings[], int count)
{
    int i, j, temp;
    do {
        j = 0;  
        for (i = 0;i<count-1;i++)
        {
            if (buildings[i] < buildings[i+1])
            {
                j = 1;
                temp = buildings[i];
                buildings[i] = buildings[i+1];
                buildings[i+1] = temp;
            }
        }
    } while (j == 1);
}

int main()
{
    FILE *fp;
    fp = fopen("buildings.out", "r");   
    struct details data1;
    size_t structSize = sizeof(struct details);
    //size_t arraySize = sizeof(int)*sizeof(buildings);
    fread(&data1, structSize, 1, fp);
    for(int i=0; i<200; i++) 
        printf("%d | ", data1.buildings[i]);

    //sort(data1.buildings );
    //print_int_array(data1.buildings, arraySize);
    //printf("Number of Houses: %d\n",numberOfHouses(data1.numberOfPresents, data1.buildings));
    fclose(fp);
    return 0;
}

最佳答案

您的结构的大小仅包括数组的最小分配(我认为是一个条目)。它实际上并没有为您想要的 200 个条目分配足够的空间。有一些可能的修复方法。

如果它始终是 200 个条目,则只需将建筑物的大小声明为 200。这是最简单的。

如果您在阅读之前知道条目数,那么您可以做一些不愉快的事情,例如(s 是条目数):

struct details *data1 = (struct details *) malloc(sizeof(struct details)+s*sizeof(int));

完成后释放数据 1。这种类型的代码通常不受欢迎,但过去很常见。读取命令也变得复杂。

最后的选择是将建筑物更改为 int*,然后在读取之前对该数组进行 m​​alloc。同样,读取必须在循环中完成。

关于c - 从 C 中的结构打印 int 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13828650/

相关文章:

c++ - CMake + ccache : RULE_LAUNCH_COMPILE or CMAKE_<LANG>_COMPILER_LAUNCHER

php - 修改 php-imap 扩展以允许 oauth 身份验证

c - 确保低功耗的最佳做法

c - 在c中用信号量同步两个子进程

c - 根据子字符串查找删除列表条目

调用 pthread_cond_broadcast 是否持有互斥量?

c - 当您声明一个边界为空的数组时会发生什么

c - 为什么字符串终止不会发生在空字符处

c - 真实分配 : invalid next size while splitting a line

c - 数字浮点误差的上限