-4

我正在尝试使用整数指针一次将 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]);
}

我哪里错了?

4

3 回答 3

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指向整数而不是指向整数的数组/指针。

于 2013-07-27T05:38:53.787 回答
2

你做错的是你认为数组是指针,而二维数组是双指针。这是不正确的,请阅读本文

如果要访问二维数组的第一个元素,请使用

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;
于 2013-07-27T05:44:13.823 回答
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是未初始化的垃圾。因此,您正在尝试写入一些导致分段错误的随机内存位置。

于 2013-07-27T06:02:25.260 回答