2016-10-28 2 views
1

Я использую массив, и я попробовал этот код:Динамический массив в C

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
char **q = (char*)malloc(1*sizeof(char*)); 
q[0]="So Many Books"; 
q[1]="So Many Books"; 
q[2]="So Many Books"; 
q[3]="So Many Books"; 
q[4]="So Many Books"; 
printf("%s\n",q[0]); 
printf("%s\n",q[1]); 
printf("%s\n",q[2]); 
printf("%s\n",q[3]); 
printf("%s\n",q[4]); 
return 0; 
} 

Почему компилятор не дает мне ошибку здесь? Я только забронировал место для одной струны из массива строк.

Я посмотрел на некоторые ресурсы, как:

+0

Ошибок синтаксиса нет, поэтому ошибок компилятора нет. В 'c' управление памятью до программиста. Похоже, вы уже знаете, что ваш код изобилует UB. – yano

+0

Вы программист на C. Предполагается, что вы знаете, что делаете. Если вам нужна ручная работа, выберите другой язык. Это особенно сильно сказывается на новичках, но мышление - «программист знает, что они делают», даже если это очевидно, что они этого не делают. –

+4

Почему вы задаете результат 'malloc'' char * ', когда вам нужен символ' char ** '? Почему вы полностью обманываете результат 'malloc'? – AnT

ответ

2

Почему компилятор не дает мне ошибку здесь

Просто потому, что проблема здесь не связана с какой-либо синтаксической ошибкой, это логическая ошибка, которая выходит за рамки юрисдикции проверки ошибок компилятора.

Проблема здесь, кроме индекса 0, любой другой индекс находится вне связанного доступа здесь. В стандарте C ничего нет stop вы от этого делаете, но доступ к внешней памяти вызывает undefined behavior, поэтому выход программы также не определен. Может произойти все, что угодно. Просто не делай этого.

Помните, что только потому, что вы можете сделать что-то (код записи, чтобы получить доступ из связанной памяти) не означает, что вы должны делать это.

сказано, please see this discussion on why not to cast the return value of malloc() and family in C..