可变大小的2D数组声明是否错误?

0 c sizeof

这是main.c:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int size = atoi(argv[1]);

    int int_array[10][10];

    int *before = NULL;
    int *val[size];
    int *after = NULL;
    printf("before:%p, after:%p, sizeof val:%lu\n", before, after, sizeof val);

    int i = 0;
    /*for (; i < 10; i++) {
        val[i] = int_array[i];
    }*/
    val[0] = int_array[0];
    val[1] = int_array[3];

    printf("int_array:%p, int_array[0]:%p, int_array[1]:%p, int_array[2]:%p, int_array[3]:%p\n", int_array, int_array[0], int_array[1], int_array[2], int_array[3]);
    printf("val:%p, val[0]:%p, val[1]:%p, val[2]:%p, val[3]:%p\n", val, val[0], val[1], val[2], val[3]);
    printf("before:%p, after:%p\n", before, after);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
[root@localhost test]# ./test 3
before:(nil), after:(nil), sizeof val:24
int_array:0x7ffeadc69470, int_array[0]:0x7ffeadc69470, int_array[1]:0x7ffeadc69498, int_array[2]:0x7ffeadc694c0, int_array[3]:0x7ffeadc694e8
val:0x7ffeadc69440, val[0]:0x7ffeadc69470, val[1]:0x7ffeadc694e8, val[2]:0x3, val[3]:0x4005ba
before:(nil), after:(nil)

[root@localhost test]# ./test 6
before:(nil), after:(nil), sizeof val:48
int_array:0x7ffcd30f1f50, int_array[0]:0x7ffcd30f1f50, int_array[1]:0x7ffcd30f1f78, int_array[2]:0x7ffcd30f1fa0, int_array[3]:0x7ffcd30f1fc8
val:0x7ffcd30f1f00, val[0]:0x7ffcd30f1f50, val[1]:0x7ffcd30f1fc8, val[2]:0x7ffcd30f2220, val[3]:(nil)
before:(nil), after:(nil)
Run Code Online (Sandbox Code Playgroud)

编译代码:gcc -o test main.c,然后在./test 3和./test 6上面得到输出。那么,这不是编译时间,而是sizeof()确定运行时的时间?

eer*_*ika 8

可变大小的2D数组声明是否错误?

在C ++中,所有数组变量的大小必须是一个编译时间常数。size不是编译时间常数,因此int *val[size];在C ++中格式不正确。