首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无效的初始化器是什么意思?

无效的初始化器是什么意思?
EN

Stack Overflow用户
提问于 2021-11-22 18:34:42
回答 4查看 625关注 0票数 0

具有以下代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

#define SIZE 5

int main()
{
    //int (*ar)[10] = malloc(sizeof *ar * SIZE);
    int *ar[10] = malloc(sizeof *ar * SIZE);
    printf("%ld\n", sizeof *ar);
}

我得到了

代码语言:javascript
复制
a.c:8:19: error: invalid initializer
    8 |     int *ar[10] = malloc(sizeof *ar * SIZE);
      |

为什么指针初始化使用“无效初始化程序”?这里什么是无效的?

EN

回答 4

Stack Overflow用户

发布于 2021-11-22 18:39:50

您声明了一个由10个类型的int *元素组成的数组

代码语言:javascript
复制
int *ar[10] = malloc(sizeof *ar * SIZE);

并尝试使用表达式malloc(sizeof *ar * SIZE)初始化数组。所以编译器发出错误消息。

如果要动态分配具有SIZE类型的char[10]元素的数组,则需要编写

代码语言:javascript
复制
int ( *ar )[10] = malloc( SIZE * sizeof( char[10] ) );

为了使指针的声明更简单,您可以为由10个元素组成的数组引入ty清晰度声明。例如

代码语言:javascript
复制
typedef int TArray[10];
TArray *ar = malloc( SIZE * sizeof( TArray ) );

请注意,您需要使用转换说明符%zu输出类型为size_t的对象(它是运算符sizeof返回的值的类型)。例如

代码语言:javascript
复制
printf("%zu\n", sizeof *ar);

此调用将输出等于10 * sizeof( int )的值。如果sizeof( int )等于4,那么输出的值将是40

票数 1
EN

Stack Overflow用户

发布于 2021-11-22 18:51:09

代码语言:javascript
复制
int *ar[10];

是一个由10个指向int的指针组成的数组。您需要一个指针(而不是数组)来为引用对象动态分配内存。

根据指针的类型,您可以:

代码语言:javascript
复制
int *ar = malloc(sizeof *ar * SIZE);   // space for SZIE integers
int **ar = malloc(sizeof *ar * SIZE);  // space for SIZE pointer to integers
int (*ar)[10] = malloc(sizeof *ar * SIZE); // space for SIZE * 10 integers, but pointer type is array to 10 integers/
票数 0
EN

Stack Overflow用户

发布于 2021-11-22 19:02:10

为什么这个指针初始化使用“无效初始化器”?这里什么是无效的?

int *ar[10]不声明指针。它声明了一个数组。数组的初始化器应该在大括号内,{ … },因此malloc(sizeof *ar * SIZE)对初始化数组无效。

括号中,[ … ]比取消引用操作符*绑定得更紧密,因此int *ar[10]就是int *(ar[10]),它生成了一个指针数组。要创建指向数组的指针,必须使用int (*ar)[10],如第一个声明中所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70070769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档