分段故障访问二维阵列

时间:2013-07-27 05:36:02

标签: c

我试图使用整数指针一次写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]);
}

我哪里错了?

3 个答案:

答案 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内容的第一部分是未初始化的垃圾。所以你试图写一些导致分段错误的随机内存位置。