【问题标题】:inconsistent results for struct with array in cc中带有数组的结构的结果不一致
【发布时间】:2018-11-03 11:56:15
【问题描述】:

我是编程和 C 的新手,我刚刚了解了结构。我正在尝试使用它们来创建一个可以根据需要更改大小的数组(因此,如果数组已满,它会创建一个两倍大小的新数组,将旧数组复制到新数组中并删除旧数组)。到目前为止,我所做的只是创建结构和设置它的函数,而我已经遇到了问题。主要问题是,有时当我运行它时,它完全符合我的预期,即创建结构,返回指向所述结构的指针,然后打印包含数组的所有元素。其他时候我运行它,它什么也没做!我不明白它有时是如何工作的,有时不是!显然我做错了什么,但我不知道是什么。代码如下:

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

typedef struct {
    int cap;
    int used;
    void (*cpy) (int *, const int *, int);
    //void (*append) (int);
    int array[];
} dynArray;

dynArray * new_dynArray(int *, int);
void copy(int *, const int *, int);

int main(void) {
    int start_arr[] = {1,2,3,4,5,6};
    // create new dynArray, pass start array and number of elemnts
    dynArray *arr = new_dynArray(start_arr, \
                sizeof(start_arr) / sizeof(start_arr[0]));
    // print all elements of dynArray
    for (int i=0; i<(arr->used); i++) {
        printf("%d, %d\n", arr->array[i], i);
    }
    free(arr);
    return 0;

}

dynArray * new_dynArray(int init_arr[], int size) {
    //printf("%d", size);
    // if number of elements >= 4 then dynArray size is double, else 8
    int init_cap = (size >= 4) ? 2 * size : 8;
    // create pointer with enough space for struct and the actual array
    dynArray *arr = (dynArray *) malloc(sizeof(dynArray) + init_cap );
    arr->cap = init_cap;
    arr->used = size;
    // assign address of funciton copy to arr->cpy
    arr->cpy = copy;
    // call the function, to copy init_arr to arr->array
    arr->cpy(arr->array, init_arr, size);
    return arr;
}

void copy(int dest[], const int src[], int src_size) {
    // just copy initial array to new array
    int i;
    memcpy(dest, src, src_size*sizeof(int));
    /*
    for (i=0; i<src_size; i++) {
        dest[i] = src[i];
        printf("%d\n", dest[i]);
    }*/
}

所以我调用init_dynArray,发送一个普通数组和数组中的元素个数。 init_dynArray 使用 malloc 在内存中为 struct + 数组的初始大小创建空间,设置 struct 中的所有内容并复制数组,然后返回指向它的指针。我不明白它如何只能在某些时候起作用。希望各位大侠帮忙,谢谢!

【问题讨论】:

  • arr的分配中不应该有sizeof (int)吗?

标签: c arrays struct


【解决方案1】:

您的代码中的问题出在这一行:

dynArray *arr = (dynArray *) malloc(sizeof(dynArray) + init_cap );

您需要将init_cap 乘以sizeof(int)

dynArray *arr = (dynArray *) malloc(sizeof(dynArray) + sizeof(int)*init_cap );

您还应该使用size_t 作为init_cap 的类型。

注意:如果您的动态数组由需要非平凡复制的不透明元素组成,那么在struct 中存储指向复制函数的指针会很有用。由于复制ints 可以通过简单的memcpy 完成,因此无需在dynArray 中存储函数指针。

【讨论】:

  • 啊,我明白了,谢谢!但为什么以前有时会工作有时会失败?
  • @box04057934 因为当您未能分配足够的内存并开始写入超出数组末尾的内容时,这是未定义的行为。它看起来可以工作,但程序仍然无效。
  • 好的,好的。谢谢你的帮助。我会赞成你的回答,但我没有足够的声誉。不过我已经接受了,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2021-08-09
  • 2015-03-29
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多