具有以下代码:
#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);
}我得到了
a.c:8:19: error: invalid initializer
8 | int *ar[10] = malloc(sizeof *ar * SIZE);
|为什么指针初始化使用“无效初始化程序”?这里什么是无效的?
发布于 2021-11-22 18:39:50
您声明了一个由10个类型的int *元素组成的数组
int *ar[10] = malloc(sizeof *ar * SIZE);并尝试使用表达式malloc(sizeof *ar * SIZE)初始化数组。所以编译器发出错误消息。
如果要动态分配具有SIZE类型的char[10]元素的数组,则需要编写
int ( *ar )[10] = malloc( SIZE * sizeof( char[10] ) );为了使指针的声明更简单,您可以为由10个元素组成的数组引入ty清晰度声明。例如
typedef int TArray[10];
TArray *ar = malloc( SIZE * sizeof( TArray ) );请注意,您需要使用转换说明符%zu输出类型为size_t的对象(它是运算符sizeof返回的值的类型)。例如
printf("%zu\n", sizeof *ar);此调用将输出等于10 * sizeof( int )的值。如果sizeof( int )等于4,那么输出的值将是40。
发布于 2021-11-22 18:51:09
int *ar[10];是一个由10个指向int的指针组成的数组。您需要一个指针(而不是数组)来为引用对象动态分配内存。
根据指针的类型,您可以:
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/发布于 2021-11-22 19:02:10
为什么这个指针初始化使用“无效初始化器”?这里什么是无效的?
int *ar[10]不声明指针。它声明了一个数组。数组的初始化器应该在大括号内,{ … },因此malloc(sizeof *ar * SIZE)对初始化数组无效。
括号中,[ … ]比取消引用操作符*绑定得更紧密,因此int *ar[10]就是int *(ar[10]),它生成了一个指针数组。要创建指向数组的指针,必须使用int (*ar)[10],如第一个声明中所示。
https://stackoverflow.com/questions/70070769
复制相似问题