2013-07-27 3 views
-4

Я пытаюсь записать 4 байта за один раз в буфер символов с помощью целочисленного указателя (чтобы я мог одновременно получать 4 ячейки памяти). Но я получаю ошибку сегментации.Сегментация Ошибка доступа к 2-D массиву

#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

Какая среда? no error on Windows, mingw gcc 4.6.1 – P0W

+0

Что вы пытаетесь сделать здесь? Вы создаете 2D-массив символов, присваивая ему «unsigned int», а затем обрабатывая указатель на «int», как если бы это был массив целых чисел 2D, и пытались напечатать первый его элемент (используя неправильные 'printf'). Что вы на самом деле хотите сделать? И почему вы переключаетесь между всеми этими типами? – user1118321

ответ

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

Изменить

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 указывал на целое число, а не на массив/указатели указателя на целое число.

+0

@ Rohan - Я сделал это, я все еще получаю Segmentation Fault. –

+0

Пожалуйста, оставьте объяснение, почему именно OP должен это делать? – 0decimal0

+0

@JayK, вам нужно также изменить 'printf()', см. Обновленный ответ. – Rohan

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 - это неинициализированный мусор в этой точке. Таким образом, вы пытаетесь записать в случайную ячейку памяти, которая вызывает ошибку сегментации.

+0

-Раздел мои сомнения. Понял мою ошибку. –

Смежные вопросы