Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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 uint8\u t双指针分段故障_C_Segmentation Fault_Double Pointer_Uint8t - Fatal编程技术网

C uint8\u t双指针分段故障

C uint8\u t双指针分段故障,c,segmentation-fault,double-pointer,uint8t,C,Segmentation Fault,Double Pointer,Uint8t,当影响[1][0]的值时,我有一个分段错误,我认为我的malloc是正确的,但可能没有 int main() { uint8_t **a; a = malloc(sizeof(uint8_t) * 6); *a = malloc(sizeof(uint8_t) * 2); a[0][0] = 1; // WORKS a[1][0] = 1; // DOES NOT WORK } 请记住,a的类型是“指向uint8\u t的指针” 在第一个malloc

当影响[1][0]的值时,我有一个分段错误,我认为我的malloc是正确的,但可能没有

int main() {
    uint8_t **a;

    a = malloc(sizeof(uint8_t) * 6);
    *a = malloc(sizeof(uint8_t) * 2);

    a[0][0] = 1; // WORKS
    a[1][0] = 1; // DOES NOT WORK
}

请记住,
a
的类型是“指向
uint8\u t
的指针”

在第一个
malloc
中,似乎希望
a
指向一个由6个
uint8\u t*
组成的数组。因此您的
sizeof
是错误的;您应该执行
a=malloc(sizeof(uint8\u t*)*6)

现在
a
指向一个由6个指针组成的数组(第一个元素),它们是
a[0]
a[5]
,每个指针都未初始化,可能没有指向任何有用的东西

在第二个
malloc
中,分配足够的内存来容纳2
uint8
,并设置
*a
,它与
a[0]
相同,指向该内存。请注意,
a[1]
,…,
a[5]
仍然包含未初始化的指针

因此访问
a[0][0]
是可以的,因为
a[0]
实际上指向有效内存

a[1][0]
不好,因为
a[1]
没有指向有效内存。您从未用任何东西初始化
a[1]

我认为我的马洛克是对的

它们不是。我们需要一张图片。您有两个单独的malloc块,一个大小为6(假设
sizeof(uint8\u t)
为1);我们将其称为B1,另一个大小为2(称为B2)。您还有两个指针:
a
指向第一个块,而
*a
指向第二个块

a --> [*a, x, y]
        |
        |-> [w, z]
假设您使用的是32位系统,
sizeof(void*)
为4

*a=malloc…
初始化B1的前4个字节以指向B2,保留B1的最后2个字节(未初始化的
x
y
字节)

a[0][0]=…
将B2的第一个字节(
w
字节)初始化为1

a[1][0]=…
使用块B1中偏移量4处的4个字节作为指针

问题是:这些字节中的前两个(
x
y
字节)未初始化,后两个字节总共超出了分配的块。因此,一个字节的代价是两个错误

您可以清楚地看到,例如,在valgrind输出中:

==9576== Invalid read of size 4
==9576==    at 0x804845A: main (/tmp/t.c:12)
==9576==  Address 0x420005c is 4 bytes inside a block of size 6 alloc'd
==9576==    at 0x402DBFA: malloc (valgrind/coregrind/m_replacemalloc/vg_replace_malloc.c:270)
==9576==    by 0x8048431: main (/tmp/t.c:8)
==9576== 
==9576== Use of uninitialised value of size 4
==9576==    at 0x804845C: main (/tmp/t.c:12)
==9576== 
==9576== Invalid write of size 1
==9576==    at 0x804845C: main (/tmp/t.c:12)
==9576==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
现在,不清楚您想要分配的矩阵的大小(6是从哪里来的?)

假设您想创建一个动态分配的
MxN
数组,正确的代码是:

uint8_t **a;

a = malloc(M * sizeof(a[0]));
for (j = 0; j < M; ++j)
  a[j] = malloc(N * sizeof(a[0][0]));

// Now all M by N elements are accessible:
for (j = 0; j < M; ++j)
  for (k = 0; k < N; ++k)
    a[j][k] = 1;

// cleanup.
for (j = 0; j < M; ++j)
  free(a[j]);
free(a);
uint8\u t**a;
a=malloc(M*sizeof(a[0]);
对于(j=0;j