数组定义错误:为啥会出现此错误?

Posted

技术标签:

【中文标题】数组定义错误:为啥会出现此错误?【英文标题】:array definition error: why do I have this error?数组定义错误:为什么会出现此错误? 【发布时间】:2022-01-22 16:15:59 【问题描述】:

编辑:(已解决)我重写了解决问题的 cmets:

“指针不是数组。如果您实际上有一个数组,但您没有,您只能在声明期间初始化数组,而不是在运行时分配给它们”。 “这是无效的C。你需要A.data[0] = 1; A.data[1] = 42; etc.”

当然,还有公认的答案。


(免责声明:忽略 mat_constr 函数,因为它与这个问题无关(它是我发布的另一个问题的 mat_constructor,因为我正在尝试自己编辑 mat_transpose 函数);mat_constr 通过采用矩阵变量、行和列的地址)。

    void mat_constr(struct matrix* m, size_t rows, size_t cols) 
        m->rows = rows; m->cols = cols; 
        m->data = calloc(rows * cols, sizeof(double)); 
    
// and, of course, mat_destroy to free the allocated memory. 
    void mat_destroy(struct matrix* m) 
        free(m->data); 
    

这是一个非常简单的练习,但我不知道如何(正确地)定义一个数组。

我有一个

struct matrix 
size_t rows; 
size_t cols; 
double* data 
; 

在主函数中,我必须定义一个“结构矩阵”类型的变量,然后我必须定义数组。如下:

int main(void) 
struct matrix A; 
    mat_constr(&A, 4, 4); 
    A.data =  /* a number */, /* another number* /, /* etc. */ ; 

问题在于编译器突出显示了第一个“”。在数组定义中,它说:“期望一个表达式”。 这很奇怪,因为这是数组的定义样式,我错了吗?

【问题讨论】:

指针不是数组。如果您实际上有一个数组,而您没有,您只能在声明期间初始化数组,而不是在运行时分配给它们。您的问题的答案是在您的 C 书籍中研究数组和指针的基础知识 - 您不能通过猜测语法来编程。 【参考方案1】:

问题在于 C 没有 array litteral 的概念。等号可用于两种截然不同的操作,赋值和初始化。

大括号括起来的表达式可用于初始化数组,但不能用于初始化指针,也不能赋值给指针:

double data[] = 1., 2., 3.;  // array initialization: valid
double *data = 1.,  2.,  3.; // INVALID attempt to initialize a pointer
double *d2;
d2 = 1., 2., 3.;             // INVALID assignment to a pointer

【讨论】:

【参考方案2】:

假设mat_constr 将内存分配为double 的单个数组,并使data 成员指向它,那么您可以复制到这个数组。

例如使用memcpycompound literals

memcpy(A.data, (double[16]) 1, 2, 3, ... , 16 * sizeof(double));

[在上面的示例中,我假设mat_constr 分配了一个4 * 4 元素数组。请不要让我们做出假设,而是创建一个适当的Minimal, Reproducible Example。]


您当然可以将值单独复制到数组的每个元素:

A.data[0] = 1;
A.data[1] = 2;
A.data[2] = 3;
...

如果您想将所有元素设置为单个值,您当然可以使用循环:

for (unsigned i = 0; i < 16; ++i)

    A.data[i] = 5;

或者,如果您想将所有元素设置为零,则可以使用calloc 进行分配:

A->data = calloc(A->rows * A->cols, sizeof(double));

或使用memset:

memset(A.data, 0, 16 * sizeof(double));

【讨论】:

以上是关于数组定义错误:为啥会出现此错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在尝试定义函数体时会出现此编译器错误?

c语言如果用字符串类型输出字符数组,字符数组最后一个是0,那么为啥会出现乱码

使用来自 arduino 串行打印的数据更新 matlab 中的线图,为啥会出现“数组形状错误”错误?

React Element Type 无效,为啥会出现此错误,如何解决?

为啥在计算整数数组的最小值时会出现“实际或形式参数列表长度不同”的错误?

为啥会收到此错误“模块 * 已定义”?