C динамически распределенный массив с использованием memset для инициализации

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

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main(){
int n,i;
char *tab=NULL;
printf("New size of array: ");
scanf("%d",&n);
tab=(char*)malloc(n*sizeof(char));
memset(tab,'X',n*sizeof(tab));
for(i=0;i<n;i++)
    printf("%c",tab[i]);
free(tab);
return 0;
}

3 ответа

Решение

В вашем memset вы пишете n * sizeof(tab), я думаю, что вы хотели написать: n * sizeof(char)

Вы также можете добавить +1 добавить конец вашего malloc и проверить возвращаемое значение, просто для безопасности.

Функция библиотеки C void *memset(void *str, int c, size_t n) копирует символ c (символ без знака) в первые n символов строки, на которую указывает аргумент str.

memset(tab,'X',n*sizeof(char));

Вы написали n*sizeof(tab), вы копируете символ X в неизвестную память, что может вызвать сбой во время выполнения.

Посмотрите на эту строку:

memset(tab,'X',n*sizeof(tab));

Вы объявили tab как указатель, а размер хранилища указателя составляет более одного байта. Умножив это на n, равный размеру нужного вам массива, вы сможете копировать данные в область памяти, к которой у вас нет доступа, поэтому вы получаете ошибку сегментации.

Если вы должны использовать sizeof, сделайте это:

memset(tab,'X',n*sizeof(char));

или еще лучше, просто сделайте это:

memset(tab,'X',n);

потому что символ равен одному байту и n раз 1 = n.

Другие вопросы по тегам