C动态内存分配

时间:2015-09-11 07:04:11

标签: c malloc dynamic-memory-allocation realloc calloc

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

工作正常: enter image description here

问题是: enter image description here

2 个答案:

答案 0 :(得分:6)

realloc函数可以扩展现有内存,它也可以(并且大部分时间都可以)完全分配 new 内存。 返回已重新分配的内存,并且您不会使用该返回的指针。

此外,如果realloc失败,则会返回NULL,因此请勿将返回的指针指定给您在realloc调用中使用的变量,否则您将失去原始指针。使用临时变量,检查NULL,然后重新分配给实际的指针变量。

在不相关的注释中,sizeof(char)被指定为始终为1

最后一句警告。你处理&#34;字符串的方式&#34;现在工作正常(在解决你现在遇到的问题或课程后),但如果你想把数据视为&#34;正确的&#34; C字符串,你需要分配一个额外的字符,因为C字符串由空字符'\0'终止(不要与空指针混淆,NULL)。

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

答案 1 :(得分:0)

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

Here is useful link about realloc function 我现在的工作代码

#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;
}