Проблема strings[i] = temp;
. Это присваивает temp
strings[i]
, но тогда temp
является локальной переменной, ограниченной для блока цикла, и недопустимо после завершения блока.
Вам потребуется malloc
память длякаждая строка содержит скопированное значение (и free
, когда оно будет сделано). tmp
также не требуется, поскольку мы можем sprintf
непосредственно в указатель.
SIZE = 5
, но ваш массив имеет только 4 члена, поэтому у нас есть доступ за пределами. Я предпочел бы охватить это данными, которые он представляет, а не сделать их глобальной константой. Я также предполагаю, что этот массив будет обрабатывать произвольные данные, потому что как есть, у него нет никаких преимуществ перед использованием i + 1
внутри вашего цикла.
malloc(12)
- достаточно места для хранения 32-битного целогострока (sizeof char
всегда 1, и нам нужно место для символов '-'
и '\0'
). Как указано в этом комментарии , вы можете использовать sizeof(int) * CHAR_BIT / 3 + 2
для вычисления правильного размера буфера, где CHAR_BIT
определено в заголовке limits.h
.
В качестве отступления, нет необходимости разыгрывать malloc
, и рекомендуется использовать sizeof(*strings)
в случае изменения типа указателя во время рефакторинга.
#include <stdio.h>
#include <stdlib.h>
int main() {
int nums[] = {1, 2, 3, 4};
int nums_size = 4;
char **strings = malloc(nums_size * sizeof(*strings));
for (int i = 0; i < nums_size; i++) {
strings[i] = malloc(12);
sprintf(strings[i], "%d", nums[i]);
}
for (int i = 0; i < nums_size; i++) {
printf("%s\n", strings[i]);
free(strings[i]);
}
free(strings);
return 0;
}