2015-06-26 5 views
2

Ошибка сегментации из-за инициализации переменной «b». Кто-нибудь, пожалуйста, помогите мне в этом.Ошибка сегментации (сбрасывается ядром) при инициализации переменной int

#include "stdio.h" 
#include "string.h" 

int main(){ 
    char *z[20], *x, *y = {"abcd"}; 
    int i, j, b = 4; 
    for (i = 0 ; i < 4 ; i++) { 
     for (j = 0 ; j < b ; j++) { 
      *(x + j) = *(y + j + i); 
      z[i] = x; 
      printf("%s", z[i]); 
      printf("\n"); 
     } 
     b--; 
    } 
    return 0; 
} 
+2

Честный вопрос? Почему такие вопросы занижены? – woodstok

ответ

5

Вы разыменования x, который не инициализирован в любом месте и, следовательно, является неверный указатель

*(x + j) = *(y + j + i); 

Возможное решение:

  • Объявить x как массив, как

    char x[5]; 
    

    и nul прекратить его перед печатью, как

    x[j]  = y[i + j]; 
    x[1 + j] = '\0'; 
    

Еще одна вещь, что каждый z[i], который инициализируется, будет указывать на те же данные, то есть в массив x, если применить мой предлагаемое решение.

3

У вас уже есть answer от Mr. Iharob за ваш вопрос, просто чтобы немного рассказать, хотя я добавил свой.

В своем вопросе вы упомянули, как

... когда int переменная инициализируется

Это утверждение неверно. Нет проблемы с int инициализациями переменных (i = 0, j = 0 и b = 4). Проблема здесь связана с неправильным использованием x.

В вашем коде x имеет тип char *, то есть является указателем на char. Теперь, говоря

*(x + j) = <some value> 

вы пытается присвоить значение для char что x (или, скорее x + j, в целом) указывает на. Хорошо, но подождите, подождите, что делает x (или, x + j) на самом деле указывают на настоящее время?

Ответ: x сам не инициализирован явно, поэтому он не указывает на допустимую память, где вы можете записать значение. Стандарты указывают, пытаясь прочитать или записать в неинициализированную ячейку памяти, вызывает undefined behaviour. Ошибка сегментации является одним из побочных эффектов UB.

Чтобы избежать, необходимо выделить память для x первой (так, что он указывает на правильное местоположение памяти), а затем поместить значение в ячейку памяти, оно указывает на . Вы можете использовать malloc() и семейство функций, чтобы получить выделение памяти.

+1

Я скорее подозреваю, что OP может подумать, что 'x' указывает на адрес памяти начала строки' abcd', поэтому это полезный ответ. –

+0

@JRichardSnape спасибо. Рад, что вы сочли это полезным. :-) –

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