计算未初始化的char数组的长度

时间:2016-01-27 03:00:25

标签: c arrays pointers char sizeof

我想计算(最初)未初始化的char数组的长度。

我的代码是:

#include <stdio.h>

int main()
{
    char *string_t;
    int loc = sizeof(string_t)/sizeof(*string_t);
    printf("%d", loc);

}

我希望loc0,而loc为8.有人可以告诉我为什么会这样,以及如何“修复”这个是我期望的答案?< / p>

5 个答案:

答案 0 :(得分:2)

sizeof是编译时运算符(VLA除外)。 sizeof(string_t)/sizeof(*string_t)的值等于sizeof(char *) / sizeof(char),这是指针的大小,通常是64位计算机上的8

对于未初始化的char *指针,没有正确的大小,您必须对其进行初始化:

char *string_t = "";

并使用strlen(string_t)获取0。但是,因为它是一个指向字符串文字的指针,但它在某种程度上是毫无意义的。

答案 1 :(得分:2)

你没有char数组,你有一个char *。为了得到你想要的东西,你需要: -

#include <stdio.h>

int main()
{
    char string[100];
    string[0]=0;
    int loc = strlen(string);
    printf("%d", loc);

}

答案 2 :(得分:1)

char *string_t是一个指针,而不是未初始化的char数组。它的大小固定为系统上指针的大小,看起来是8。

sizeof(*string_t)sizeof(char)相同,因此C标准修正为1。如果不从指针更改为数组,就无法产生您期望的行为。

如果你想创建一个通过realloc来调整大小的数组,你需要创建一个struct来跟踪指针和大小(或者有两个指针指向分配区块的开头和结尾。)

struct dynamic_char_array {
    char *array;
    size_t size;
};

void add_char(struct dynamic_char_array* a, char c) {
    char *tmp = realloc(a->array, (a->size)+1);
    if (tmp) {
        a->array = tmp;
    } else {
        // Do something about a failed allocation
        ...
        return;
    }
    a->array[size++] = c;
}

注意:您也可以使用可变长度数组,但一旦设置了它们的大小,就无法更改。

答案 3 :(得分:0)

要计算未初始化的char数组的长度,必须先声明一个。在您的代码中,您编写了char *string_t;。该语句声明了一个指向char的指针,而不是一个char数组。

应使用char s[1024];之类的东西声明未初始化的char数组。要创建初始化版本,请使用char s[1024] = "foo";char s[1024] = {'f', 'o', 'o'};

因此,实际上,您正在尝试计算未声明的数组的长度,这显然是不可能的。

答案 4 :(得分:-1)

&#39; char *&#39;只是指向char的指针,而不是char数组 所以你不能计算数组。

像这样使用

char array[100];
int len = sizeof(array);