C uint8\u t双指针分段故障
当影响[1][0]的值时,我有一个分段错误,我认为我的malloc是正确的,但可能没有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
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
中,分配足够的内存来容纳2uint8
,并设置*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