C中未定义长度的数组

时间:2015-11-11 16:26:55

标签: c arrays

我正在观看教科书中的一项练习:创建一个C程序,从键盘上取一个长度为" N"

的数组。

问题是:在C语言中,如何创建未定义的长度数组?

谢谢大家。

3 个答案:

答案 0 :(得分:3)

不要创建未定义长度的数组。

获得所需长度N之后,如果C99使用VLA(可变长度数组)

int A[N];

...或分配内存

int *A = malloc(sizeof *A * N);
...
// use A
...
free(A);

[编辑]

在继续之前在N上添加验证很方便。例如:

if (N <= 0 || N >= Some_Sane_Upper_Limit_Like_1000) return;

答案 1 :(得分:2)

有关c99 The New C:Why Variable Length Arrays?

中VLA的更多信息
super

答案 2 :(得分:0)

要满足100%的需求并不容易,但你可以尝试一下:

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

char *addMe(void);

int main(void){
    char *test = addMe();
    free(test);
    return 0;
}

char *addMe(void){
    unsigned int maxLength = 15;
    unsigned int i =0;

    char *name;
    int c;

    name = malloc(1);
    if(name == NULL){
        exit(1);
    }

    printf("Enter your name:>  ");

    while ((c = getchar()) != '\n' && c != EOF) {
        name[i++] = (char) c;

        if (i > maxLength) {
            printf("Names longer than %d not allowed!\n",maxLength);
            name[maxLength] = '\0';
            break;
        }else if (i < maxLength){
            name = realloc(name, maxLength + 2);
        }
    }

    name[i] = '\0';
    printf("Your name is:>  %s\nThe length is:>  %zu\n",name ,strlen(name));

    return name;
}

输出:

Enter your name:>  l
Your name is:>  l
The length is:>  1

正如您可能已经注意到我只为一个字母分配了内存,如果您需要更多内存,它将被分配以满足您的需求。您也可以使用此方法控制最大大小:

Enter your name:>  Michael jacksonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
Names longer than 15 not allowed!
Your name is:>  Michael jackson
The length is:>  15

就像我说的那样,试一试。