获取动态内存管理字符串

时间:2010-12-27 06:49:22

标签: c memory-management

我想得到像34,34; 34,21; 45,12; 45,12(长度不确定。)的字符串。 我想用realloc动态内存分配,但我不能这样做。 我怎么能把这个字符变成字符串??

它将是string = {34,34,34,21,45,12,45,12}

3 个答案:

答案 0 :(得分:3)

您必须事先知道长度,当您知道缓冲区对于新输入的数据而言太小时,请使用:

realloc(ptr, newLength);

答案 1 :(得分:0)

如果您希望在编译时执行此操作(这是执行类似于您的问题中的初始化程序的唯一方法),您可以让初始化程序定义数组的大小:

char string[] = {34,34,34,21,45,12,45,12, 0}; // added a 0 to the end to 
                                              //    make it '\0' terminated
                                              //    You might not need that

如果您希望字符串从运行时源(文件或其他输入)获取数据,您需要自己执行分配,具体如何操作取决于您将如何获取数据。

以下示例将数据从stdin读取到动态分配的字符数组中,根据需要增长数组,直到达到EOF。它每次增加20个字节的数组,这样你就可以轻松地检查调试器中发生了什么,但是现实生活中的程序会更好地通过增加大小来增长,例如增加大小或者只增加100KB - 你的细节预期数据应该指导您做出这个决定。)

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


void fatal_error(void);

int main( int argc, char** argv)
{
    int buf_size = 0;
    int buf_used = 0;

    char* buf = NULL;
    char* tmp = NULL;    

    char c;
    int i = 0;

    while ((c = getchar()) != EOF) {
        if (buf_used == buf_size) {
             //need more space in the array

             buf_size += 20;
             tmp = realloc(buf, buf_size); // get a new larger array
             if (!tmp) fatal_error();

             buf = tmp;
        }

        buf[buf_used] = c; // pointer can be indexed like an array
        ++buf_used;
    }

    puts("\n\n*** Dump of stdin ***\n");

    for (i = 0; i < buf_used; ++i) {
        putchar(buf[i]);
    }

    free(buf);

    return 0;
}

void fatal_error(void)
{
    fputs("fatal error - out of memory\n", stderr);
    exit(1);
}

答案 2 :(得分:0)

也许您将指针作为参数传递给函数b(),而函数b()又调用realloc 在这种情况下,您还需要返回指针。