我是C的新手。
创建一个数组,该数组在每个索引处保存指向另一个动态大小数组的指针。
int main()
{
unsigned int i , j;
int* array1[2];
int a1[] = {1,2,3};
int a2[] = {2,3};
array1[0] = a1;
array1[1] = a2;
for (i=0 ; i < 2; i++) {
printf(" the value of array1[%d] = %d" , i , *array1[i]);
}
return 1;
}
array1 [0]的值= 1
array1 [1]的值= 2
只有第一个元素被打印出来。如何打印索引所指向的整个数组。我错过了什么。
EDITED :: 我现在明白了这个用法,但同样直接做了,导致了一个数组。
`unsigned int* c[3];
c[0] = {0, 5, 4, 7}; // This Line Err`
c[1] = {0, 5, 4, 3, 2, 6, 7};
c[2] = {0, 5, 4, 3, 2};
导致错误:文件try.c line xx function main:`{'
之前的语法错误
为什么??
由于
答案 0 :(得分:2)
如您所知, array1 [0] 包含指向a1数组的第一个元素的指针;要打印a1
数组的所有元素,你应该迭代它,如下所示:
for (int i = 0; i < 2; i++){
printf(" the value of a1[%d] = %d", i, *(array1[0] + i);
}
答案 1 :(得分:1)
数组被衰减为C中的指针,特别是在将其作为参数传递时(或将其存储在指针中)。
您缺少的是,在运行时,数组的实际大小不保留(并且sizeof
是编译时运算符,已替换由编译器通过常量 - 除了VLA s)。
您可能希望将数组大小及其内容保持在一起。使用struct
和最后flexible array member是一种可爱的方式:
struct vect_st { unsigned size; int flexarr[]; };
struct vect_st* arr1[2];
此类结构需要heap allocated(因为您只知道它们在运行时的实际大小):
arr1[0] = malloc(sizeof(struct (vect_st) + 2*sizeof(int));
if (!arr1[0]) {perror("malloc arr1[0]"); exit(EXIT_FAILURE); };
arr1[0]->size = 2;
arr1[0]->flexarr[0] = 4;
arr1[0]->flexarr[1] = 17;
arr1[1] = malloc(sizeof(struct (vect_st) + 3*sizeof(int));
if (!arr1[1]) {perror("malloc arr1[1]"); exit(EXIT_FAILURE); };
arr1[1]->size = 3;
arr1[1]->flexarr[0] = 5;
arr1[1]->flexarr[1] = 6;
arr1[1]->flexarr[2] = 7;
当然,你应该在你不需要时释放内存,所以你可能会用{/ p>这样的代码结束你的main
free(arr1[0]), arr1[0] = NULL;
free(arr1[1]), arr1[1] = NULL;
谨防memory leaks,buffer overflows和其他undefined behavior。所以用所有警告编译你的代码&amp;调试信息(gcc -Wall -Wextra -g
)并使用valgrind和gdb
debugger。
另请注意,您通常不应将非小型数组(或聚合)声明为本地数据(例如int biglocarr[1000000];
或其他一些函数中的某些本地 main
,因为call stack的大小有限(通常为几兆字节,因此每个呼叫帧不超过几百字节)。阅读stack overflows并避免使用它们。
答案 2 :(得分:0)
你正在使用* array1 [i],这里“*”表示array1 [i]的指针和值,i在第一种情况下为0,因此它指向a1 base,即1,依此类推..