有這個代碼:
#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);
|
為什么這個指標初始化使用了“無效的初始化程式”?這里什么是無效的?
uj5u.com熱心網友回復:
您宣告了一個包含 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 個元素的陣列引入 typedef 宣告。例如
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。
uj5u.com熱心網友回復:
就像3 (4*5)完全不同(3 4)*5,
int *(x[10]); // int *x[10];
完全不同于
int (*x)[10];
下面創建一個包含 10 個指標的陣列:
int *ar[10];
陣列使用{ }. [1]例如,您可以使用以下內容:
int *ar[10] = {
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL
};
但在這種情況下,您可能會使用以下內容:
int *ar[10];
for (int i=10; i--; ) {
ar[i] = malloc(sizeof(*ar));
*(ar[i]) = 0;
}
這會產生以下結果:
--------------- sizeof( ar ) == sizeof( int * ) * 10
ar --->| 0 | sizeof( ar[0] ) == sizeof( int * )
--------------- | --------------- sizeof( *(ar[0]) ) == sizeof( int )
| -------
---------------
| -------
--------------- | ---------------
| | --->| 0 |
... ---------------
| |
---------------
下面創建一個(單個)指標,指向一個由 10 個指標組成的陣列。
int (*p)[10];
它可以分配如下:
int (*p)[10] = malloc(sizeof(*p));
for (int i=10; i--; )
(*p)[i] = 0;
這會產生以下結果:
p
--------------- --------------- sizeof( p ) == sizeof( int * )
| ----------->| 0 | sizeof( *p ) == sizeof( int * ) * 10
--------------- --------------- sizeof( (*p)[0] ) == sizeof( int )
| 0 |
---------------
| |
...
| |
---------------
特例,
char s[] = "abc";是一個簡寫
char s[] = { 'a', 'b', 'c', 0 };
uj5u.com熱心網友回復:
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/
uj5u.com熱心網友回復:
為什么這個指標初始化使用了“無效的初始化程式”?這里什么是無效的?
int *ar[10]不宣告指標。它宣告了一個陣列。陣列的初始值設定項應在大括號內{ … },因此malloc(sizeof *ar * SIZE)不能初始化陣列。
括號,[ … ]比解參考運算子系結得更緊密*,所以int *ar[10]是int *(ar[10]),形成一個指標陣列。要創建指向陣列的指標,您必須使用int (*ar)[10],如您的第一個宣告所示。
uj5u.com熱心網友回復:
您應該使用:此外,您對 sizeof 使用了錯誤的語法。
// pointer to an array of five numbers
int (* ar)[10] = NULL;
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
int main(){
int *ar = malloc(sizeof(int) * SIZE);
printf("%ld", sizeof(ar));
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/363240.html
上一篇:C中的字串記憶體重新分配陣列
