Новичок C программист, имеющий проблемы со строками и malloc - PullRequest
0 голосов
/ 14 апреля 2020

Я начинаю с C программирования и сейчас изучаю структуры и использую указатели для работы с ними. Я пытался написать простую программу, которая хранит ваши личные данные (имя и день рождения) для практики, но у меня были проблемы с распределением памяти, и я явно что-то упустил - поэтому я попробовал что-то более простое, и, очевидно, я У меня проблемы с выделением памяти для строки. Я старался изо всех сил в отладке этого, но я понятия не имею, что не так.

#include<stdio.h>
#include<stdlib.h>
#include<stddef.h>
#include<string.h>
int main()
{
    char DummyString[100];
    printf("Enter a string to be read back to you: ");
    scanf("%s",&DummyString);
    printf("The string is: %s\n",DummyString);
    printf("String length is %d\n",strlen(DummyString));
    printf("sizeof char is %i\n",sizeof(char*));
    // char DumbStringPtr=&DumbString;
    char *DummyStringPtr = (char*)malloc((sizeof(char))*(strlen(DummyString)+1)); // returns 8 regardless of anything
    printf("The size of the pointer would be %d\n", sizeof(DummyStringPtr));
}

В исходной программе ошибка возникла после попытки скопировать строку в выделенный указатель, что, как я полагаю, связано с нехваткой памяти (при необходимости покажет код). Я чувствую, что пропустил что-то фундаментальное, и поэтому буду признателен за любые отзывы. Я был бы очень признателен, если бы кто-нибудь дал мне понять мою ошибку. Спасибо!

1 Ответ

3 голосов
/ 14 апреля 2020
  • scanf("%s",&DummyString); неверно. Поскольку DummyString является массивом, вы получаете указатель на его первый элемент, когда используете его в выражении, и именно этого ожидает scanf. Измените на scanf("%s",DummyString);.
  • Строка mallo c неоправданно раздута, просто сделайте
    char *DummyStringPtr = malloc(strlen(DummyString)+1));
  • Размер указателя всегда равен 4 (или 8 и * 1025). *) независимо от того, куда он указывает. sizeof не скажет вам, сколько памяти вы выделили. Вы должны следить за этим самостоятельно, в отдельной переменной размера, если это необходимо.
  • Правильный спецификатор преобразования printf для результата sizeof равен %zu, поскольку sizeof возвращает тип size_t. Быстрая и грязная версия для новичков заключается в использовании printf("%d", (int)sizeof(something));
  • Всегда free(DummyStringPtr);.
...