char** list
Это не «массив байтов», это «указатель на указатель на символ», который вы можете рассматривать как «список списков символов».Кроме того, если вы определяете это таким образом, вам нужно выделять достаточно памяти для хранения данных.
Когда вы пишете:
list[i] = 'a';
Это портит память, потому что вы помещаете символ 'a'в месте, указанном для хранения указателя.На самом деле в большинстве компиляторов символьные литералы имеют тип int, так что вы на самом деле храните форму int в виде «a» в качестве указателя на область памяти, которая может вызвать все виды повреждения памяти.
Если вы хотите, чтобы «список» находился в стеке, определите его как:
char list[20]
Если вы хотите, чтобы «список» был в куче, определите его как:
char* list;
list = malloc(sizeof(char) * 20);
В любом случае обращайтесь к нему как:
list[i]
Также небезопасно предполагать, что размер int эквивалентен размеру указателя, как вы это сделали во втором примере.По крайней мере, я думаю, это то, что ты пытался сделать.
Кроме того, если вы храните необработанные байты из потока данных или что-то в этом роде, вам, вероятно, следует использовать «unsigned char», а не «char», и для большей безопасности используйте «int8_t», поскольку вы не всегда можете гарантировать, что'char' - это 8 бит, хотя он используется на большинстве платформ.