将Malloc用于i-C-String

将Malloc用于i-C-String,c,arrays,string,function,memory-management,C,Arrays,String,Function,Memory Management,我想知道是否有可能创建一个可以存储无限长字符串的无限数组 我的确切意思是,我想创建一个函数,它可以得到长度为n的I字符串。我想在程序中输入无限长的字符串,可以是无限长的字符 void endless(int i){ //store user input on char array i times } 为了实现这一点,我需要malloc,我通常会这样使用它: string = malloc(sizeof(char)); 但是,对于5个或10个阵列,甚至是无穷无尽的阵列流,这是如何工

我想知道是否有可能创建一个可以存储无限长字符串的无限数组

我的确切意思是,我想创建一个函数,它可以得到长度为n的I字符串。我想在程序中输入无限长的字符串,可以是无限长的字符

void endless(int i){
     //store user input on char array i times 
}
为了实现这一点,我需要malloc,我通常会这样使用它:

string = malloc(sizeof(char));
但是,对于5个或10个阵列,甚至是无穷无尽的阵列流,这是如何工作的呢?或者这是不可能的

编辑: 我知道记忆不是无止境的,我的意思是,如果记忆是无限的,你会怎样去实现它?或者只分配内存,直到所有内存都用完

编辑2: 所以我玩了一会儿,结果是:

void endless (char* array[], int numbersOfArrays){
int j;

//allocate memory
for (j = 0; j < numbersOfArrays; j++){
    array[j] = (char *) malloc(1024*1024*1024);
}

//scan strings
for (j = 0; j < numbersOfArrays; j++){
    scanf("%s",array[j]);
    array[j] = realloc(array[j],strlen(array[j]+1));
}

//print stringd
for (j = 0; j < numbersOfArrays; j++){
    printf("%s\n",array[j]);
}
}
void无尽(字符*数组[],整数数组){
int j;
//分配内存
对于(j=0;j<阵列数;j++){
数组[j]=(char*)malloc(1024*1024*1024);
}
//扫描字符串
对于(j=0;j<阵列数;j++){
scanf(“%s”,数组[j]);
数组[j]=realloc(数组[j],strlen(数组[j]+1));
}
//印花细线
对于(j=0;j<阵列数;j++){
printf(“%s\n”,数组[j]);
}
}

但是这不起作用也许我把realloc部分搞错了

记忆不是无限的,因此你不能

我的意思是,计算机中的物理内存有其局限性

当您的程序请求太多内存时,将失败且不分配内存:

如果函数未能分配请求的内存块,则返回空指针


假设内存是无限的,那么我将创建一个sxn2d数组,其中
S
是字符串的数量,
N
是您得到的字符串的最长长度,但显然有很多方法可以做到这一点!;)

另一种方法是使用一个简单的链表(如果需要,我在中有一个),其中每个节点都有一个char指针,该指针最终将承载一个字符串


您可以定义一个最大长度,您可以假定它是字符串的最大长度。否则,您可以分配一个巨大的1d字符数组,用于插入新字符串,使用
strlen()
查找字符串的实际长度,然后动态分配一个数组,该数组的大小正好是所需的大小,等于空字符串终止符的长度+1

我想知道是否有可能创建一个可以存储无限长字符串的无限数组

内存不能是无限的。因此,答案是否定的。即使你拥有每一个大内存,你也需要一个处理器来处理这个巨大的内存空间。通过
malloc
可以分配的动态内存量和可以分配的静态内存量(在编译时分配)是有限制的<如果堆内存中没有您请求的合适内存块,则code>malloc函数调用将返回NULL

假设相对于输入字符串所需的空间,您有非常大的可用内存空间,并且永远不会耗尽内存。可以使用二维数组存储输入字符串

C并没有真正的多维数组,但有几种方法可以模拟它们。您可以使用指向(动态分配)数组的指针(动态分配)数组。这主要用于直到运行时才知道数组边界的情况。或

您还可以分配一个具有足够长度和宽度的全局二维数组。存储随机大小的输入字符串的静态分配不是一个好主意。大部分内存空间将未使用

另外,
C编程语言
没有
string
数据类型。可以使用以null结尾的字符数组模拟字符串。因此,要在C中动态分配字符数组,我们应该使用
malloc
如下所示:

char *cstr = malloc((MAX_CHARACTERS + 1)*sizeof(char));

此处,
MAX_CHARACTERS
表示可存储在
cstr
数组中的最大字符数。如果字符串中存储了
MAX_字符,则添加
+1
null
字符分配空间

下面是一个玩具示例程序,要求用户输入一些字符串。在
get_string()
函数中为字符串分配内存,然后在
add_string()
函数中将指向字符串的指针添加到数组中,该函数还为数组存储分配内存。您可以根据需要添加任意长度的字符串,直到您的计算机内存耗尽,此时您可能会出现故障,因为没有检查内存分配是否成功。但是那需要大量的打字

我想这里重要的一点是有两个分配步骤:一个用于字符串,另一个用于存储字符串指针的数组。如果向存储阵列中添加字符串文字,则无需为其分配。但是,如果您添加了一个在编译时未知的字符串(如用户输入),那么您必须为它动态分配内存

编辑: 如果有人试图运行下面列出的原始代码,他们可能会遇到一些奇怪的长字符串行为。具体来说,它们可以被截断,并以一个神秘角色终止。这是因为原始代码没有正确处理空行的输入。我确实测试了很长的一根弦,它似乎起了作用。我想我只是得到了“幸运”。而且,还有一个很小的(1字节)内存泄漏。原来我忘了从
newstring
中释放指向的内存,它在退出时包含一个'\0'字符。谢谢你,瓦尔格林

如果我从
get_string()
函数返回一个NULL,而不是一个空字符串来指示输入的空行,那么从一开始就可以避免这一切。吸取的教训?下面的源代码是h
#include <stdio.h>
#include <stdlib.h>

char * get_string(void);
char ** add_string(char *str, char **arr, int num_strings);

int main(void)
{
    char *newstring;
    char **string_storage;
    int i, num = 0;

    string_storage = NULL;

    puts("Enter some strings (empty line to quit):");
    while ((newstring = get_string()) != NULL) {
        string_storage = add_string(newstring, string_storage, num);
        ++num;
    }

    puts("You entered:");
    for (i = 0; i < num; i++)
        puts(string_storage[i]);

    /* Free allocated memory */
    for (i = 0; i < num; i++)
        free(string_storage[i]);
    free(string_storage);

    return 0;
}

char * get_string(void)
{
    char ch;
    int num = 0;
    char *newstring;

    newstring = NULL;
    while ((ch = getchar()) != '\n') {
        ++num;
        newstring = realloc(newstring, (num + 1) * sizeof(char));
        newstring[num - 1] = ch;
    }
    if (num > 0)
        newstring[num] = '\0';

    return newstring;
}

char ** add_string(char *str, char **arr, int num_strings)
{
    ++num_strings;
    arr = realloc(arr, num_strings * (sizeof(char *)));
    arr[num_strings - 1] = str;

    return arr;
}