我试图使用整数指针一次写4个字节到字符缓冲区(这样我一次可以访问4个内存位置)。 但是我遇到了分段错误。
#include<stdio.h>
void main()
{
unsigned char ssdData[2][10];
unsigned int** cur_ptr;
printf("1\n");
cur_ptr=ssdData;
printf("2\n");
**cur_ptr=(unsigned int)5;
printf("3\n");
printf("cur_ptr=%d",cur_ptr[0][0]);
}
我哪里错了?
答案 0 :(得分:2)
更改
unsigned int** cur_ptr;
**cur_ptr=(unsigned int)5;
printf("cur_ptr=%d",cur_ptr[0][0]);
到
unsigned int * cur_ptr;
*cur_ptr=(unsigned int)5;
printf("cur_ptr=%d",cur_ptr[0]); //or printf("cur_ptr=%d", *cur_ptr);
使用cur_ptr
的单指针代替双指针。你希望cur_ptr
指向整数而不指向指向整数的指针的数组/指针。
答案 1 :(得分:2)
你做错了是你认为数组是指针而2D数组是双指针。这不正确,read this。
如果要访问二维数组的第一个元素,请使用
arr[0][0] = 5;
或等效的
**arr = 5;
其中arr
是数组。如果它是指针,则需要声明并使用它:
int (*ptr)[10] = &arr[0];
(*ptr)[0] = 5;
// or:
**ptr = 5;
或者像这样:
int *ptr = arr[0];
ptr[0] = 5;
// or:
*ptr = 5;
答案 2 :(得分:1)
您将cur_ptr
声明为指向unsigned int
的指针。
然后,您将cur_ptr
初始化为数组ssdData
,该数组在表达式中衰减为ssData
的地址。所以你的记忆如下:
cur_ptr--> | ssdData[0][0] | ssdData[0][1] | . . . | ssData[1][9] |
分配给**cur_ptr
时,您将分配到cur_ptr
指向的内存位置所指向的内存位置。因此,您将内容ssData
的第一部分作为地址阅读并尝试分配到该位置。此时ssData
内容的第一部分是未初始化的垃圾。所以你试图写一些导致分段错误的随机内存位置。