为什么以下方法不能在C中初始化long long int数组:
int **m = malloc(n * sizeof(int *));
for (int i = 0; i < n; i++) m[i] = malloc(n * sizeof(long long int));
要工作,必须是:
long long int **m = malloc(n * sizeof(long long int *));
for (int i = 0; i < n; i++) m[i] = malloc(n *sizeof(long long int));
我不明白为什么指向long long int的指针不适合int?这只是一个地址,对吧?
答案 0 :(得分:2)
它不是指针的大小,而是与之关联的类型。当您的分配完成时,这完全没问题,只要您使用m
作为int
的矩阵,您最终会写出这样的内容:
long long int myLongLongInt = 1234567;
m[row][col] = myLongLongInt;
这就是问题所在,因为m[row][col]
是整数类型的左值,而不是long long int
类型。 m
行的两个相邻元素相距sizeof(int)
,而不是sizeof(long long int)
。因此,分配将无法正常工作。
答案 1 :(得分:2)
您问题中的两个片段都没有初始化long long int
的数组。
int
long long int
数组的指针数组,但这些数组都不会被初始化。n * sizeof(long long int)
而不是n * sizeof(int)
的第二级数组分配内存,但它不会导致问题,因为long long int
不能小于int
size_t
。i
类型作为索引int
以获得完全一致性。指向long long int的指针不适合int?这只是一个地址,对吗?:
int
。大多数64位系统都有32位// allocate and initialize the 2D indirect array
long long int **m = malloc(n * sizeof(*m));
for (size_t i = 0; i < n; i++) {
m[i] = calloc(n, sizeof(*m[i]));
}
// allocate and initialize a 2D indirect array with a single chunk
long long int **m = malloc(n * sizeof(*m));
m[0] = calloc(n * n, sizeof(*m[0]));
for (size_t i = 1; i < n; i++) {
m[i] = m[i - 1] + n;
}
// allocate and initialize a flat 2D array:
long long int m[n][n] = calloc(1, sizeof(m));
和64位指针。以下是分配和初始化2D伪阵列的更可靠方法:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_view_id"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="\Backslash />
</LinearLayout>