C动态内存分配

问题描述 投票:0回答:3

我正在学习C,但我仍然是一个菜鸟。 我正在编写一个程序作为动态内存分配的练习,该程序从用户那里获取长度未知的文本,并返回没有空格、制表符、特殊字符或数字的文本。 该程序似乎运行良好,只是某些文本似乎因未知原因而更改为未知字符。 这是代码:

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

int main()
{
    char *pstring;
    pstring = (char *)malloc( sizeof(char));

    char c = '$';

    int i = 0;
    while(c != '\n')
    {
        c = getchar();
        if(isalpha(c))
        {
            pstring[i] = c;
            realloc(pstring, (i+2)*sizeof(char));
            i++;
        }
    }

    int j;
    for(j = 0; j < i; j++)
    {
        printf("%c", pstring[j]);
    }

    return 0;
}

工作正常:

问题是:

c malloc dynamic-memory-allocation realloc calloc
3个回答
6
投票

realloc
函数可以扩展现有内存,但是它也可能(并且可能大多数时候)完全分配new内存。它返回它重新分配的内存,并且您不使用返回的指针。

此外,如果

realloc
失败,那么它将返回
NULL
,因此不要将返回的指针分配给您在
realloc
调用中使用的变量,否则您将丢失原始指针。使用临时变量,并检查
NULL
,然后重新分配给实际的指针变量。

在不相关的注释中,

sizeof(char)
被指定为始终为
1


最后一句警告。您现在处理“字符串”的方式工作正常(在解决您现在或课程中的问题之后),但是如果您想将数据视为“正确的”C 字符串,则需要分配一个额外的字符,因为 C字符串以空字符

'\0'
终止(不要与空指针
NULL
混淆)。

如果您的字符串没有此终止符,则使用任何标准字符串函数都将导致未定义的行为,因为它很可能超出分配的内存范围。


0
投票

正如 Joachim Pileborg 所说,realloc 可能会将内存块移动到新位置,我们应该将指针更改为该新位置

这里是关于 realloc 函数的有用链接 我现在的工作代码

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

int main()
{
    char *pstring, *ptemp;
    pstring = (char *)malloc( sizeof(char));

    char c = '$';

    int i = 0;
    while(c != '\n')
    {
        c = getchar();
        if(isalpha(c))
        {
            pstring[i] = c;
            ptemp = realloc(pstring, (i+2)*sizeof(char));
            if(ptemp != NULL)
            {
                pstring = ptemp;
                i++;
            }
        }
    }

    int j;
    for(j = 0; j < i; j++)
    {
        printf("%c", pstring[j]);
    }

    return 0;
}

0
投票

这是考虑了 Joachim Pileborg 提到的所有要点后的代码,我真的很抱歉很长时间忘记回复这个问题。

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

int main()
{
    char *pstring, *ptemp;
    pstring = (char *)malloc(1);

    char c = '$';
    int i = 0;

    while(c != '\n')
    {
        c = getchar();
        if(isalpha(c))
        {
            pstring[i] = c;
            ptemp = realloc(pstring, i+2);
            if(ptemp != NULL)
            {
                pstring = ptemp;
                i++;
            }
        }
    }

    pstring[i] = '\0';
    printf("%s", pstring);

}
© www.soinside.com 2019 - 2024. All rights reserved.