C中的2D初始化语法

时间:2017-01-11 04:37:24

标签: c pointers initialization malloc

为什么以下方法不能在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?这只是一个地址,对吧?

2 个答案:

答案 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>