Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用内存模型图计算代码的o/p?为什么这是一个错误?_C_Arrays_Pointers_Multidimensional Array - Fatal编程技术网

C 如何使用内存模型图计算代码的o/p?为什么这是一个错误?

C 如何使用内存模型图计算代码的o/p?为什么这是一个错误?,c,arrays,pointers,multidimensional-array,C,Arrays,Pointers,Multidimensional Array,该代码给出***a上的Seg故障。请用内存图解释这个数组是如何存储在内存中的。如果我错了,请纠正我3行3高的2个数组。还要告诉空空间是否存储“/0”或垃圾值。因为printf(“%s”,***a)将字符'g'转换为指针,由于明显的原因,该指针无效,因为字符到指针的转换是UB 查看此函数的差异(也请注意末尾的零) 或 如果您的目标是证明C中的多维数组只是一个内存块,而实际上a变量只是它的第一个字节的地址,那么您可以这样做: int yyy() { char a[2][3][3] = { '

该代码给出***a上的Seg故障。请用内存图解释这个数组是如何存储在内存中的。如果我错了,请纠正我3行3高的2个数组。还要告诉空空间是否存储“/0”或垃圾值。

因为
printf(“%s”,***a)
将字符
'g'
转换为指针,由于明显的原因,该指针无效,因为字符到指针的转换是UB

查看此函数的差异(也请注意末尾的零)


如果您的目标是证明C中的多维数组只是一个内存块,而实际上
a
变量只是它的第一个字节的地址,那么您可以这样做:

int yyy()
{
    char a[2][3][3] = { 'g','a','t','e','s','q','u','i','z','a','w',0 };
    char *ptr = **a;
    while (*ptr) printf("%c", *ptr++);
    return 0;
}

在将“%s”更改为“%c”之后,提问者删除了相同的问题。这与你有关吗?也许提问者是你的同事,正在做同一项作业。简单的回答是,
***a
是一个
字符
,然后
“%s”
的格式不正确。您的编译器应该能够告诉您:错误:format指定类型“char*”,但参数的类型“char”无效,原因很明显“显然,OP的原因不明显,因此问题就来了。”因为printf(“%s”,***a);在我写printf(“%c”,***a)时将字符“g”转换为指针);o/p是“g”,但在%s的情况下不是这样,你能更清楚地说明这一点吗。***a取消引用数组的第一个元素(在本例中是“g”)。然后,ASCII码“g”的整数值被转换为指针-wch,该指针指向内存中的某个非法位置。当您尝试访问此位置时,出现内存错误
int zz()
{
    char a[2][3][3] = { 'g','a','t','e','s','q','u','i','z','a','w',0 };
    printf("%s ", &***a);
    return 0;
}
int yyy()
{
    char a[2][3][3] = { 'g','a','t','e','s','q','u','i','z','a','w',0 };
    char *ptr = **a;
    while (*ptr) printf("%c", *ptr++);
    return 0;
}
char a[2][3][3] = {'g','a','t','e','s','q','u','i','z','a','w'};

// Print all chars, this is ok because you've initialized your
// 12-element array by 11 chars and the last one is automatically set to 0
printf("%s\n", (char *)a);

// Print the first char
printf("%c\n", *(char *)a);