C动态内存分配

Nor*_*mer 2 c malloc realloc calloc 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;
}
Run Code Online (Sandbox Code Playgroud)

工作正常: 在此输入图像描述

问题是: 在此输入图像描述

Som*_*ude 6

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

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

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


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

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