繁体   English   中英

C动态内存分配

[英]C dynamic memory allocation

我正在学习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;
}

工作正常: 在此处输入图片说明

问题是: 在此处输入图片说明

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

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

在不相关的说明中,将sizeof(char)指定为始终为1


最后要提个警告。 现在,您处理“字符串”的方式可以正常工作(解决了您现在或遇到的问题之后),但是如果您要将数据视为“适当的” C字符串,则需要分配一个额外的字符,因为C字符串以空字符'\\0'终止(不要与空指针NULL混淆)。

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

正如Joachim Pileborg所说,重新分配可能会将内存块移至新位置,我们应该将指针更改为该新位置

这是有关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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM