【问题标题】:Calculating length of uninitialized char array计算未初始化字符数组的长度
【发布时间】:2016-05-03 20:30:58
【问题描述】:

我想计算一个(起初)未初始化的字符数组的长度。

我的代码是:

#include <stdio.h>

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

}

我希望 loc0,但 loc 是 8。有人可以告诉我为什么会这样以及如何“修复”这个问题以成为我期望的答案吗?

【问题讨论】:

  • 你能解释一下你为什么期望0吗?
  • @M.M 我在几个论坛 (stackoverflow.com/questions/6001661/…) 上看到 sizeof(string_t)/sizeof(*string_t) 是您查找 char 数组长度的方法
  • 您的代码中没有任何字符数组。数组由[ ] 表示。
  • @M.M 哦,我在想既然数组衰减成指针,我基本上有一个数组

标签: c arrays pointers char sizeof


【解决方案1】:

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

对于未初始化的char *指针,没有正确的大小,你必须初始化它:

char *string_t = "";

并使用strlen(string_t) 获取0。然而,由于它是一个指向字符串字面量的指针,所以它在某种程度上毫无意义。

【讨论】:

  • 好的,这是有道理的,但是下一步我想向string_t 添加一些字符,然后再次检查大小,strlen 会导致我的指针错误
  • 这就是为什么我说它毫无意义。你需要一个实际的数组char string_t[1024] = "",或者使用动态分配。
【解决方案2】:

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

#include <stdio.h>

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

}

【讨论】:

  • 如果我不确定自己需要多少空间怎么办?
  • 那么你需要malloc和realloc。当你获得 malloc 的内存时,你确实需要一个指针,这样你就可以指向它给你的内存。如果你用完了,重新分配你的内存以更大
【解决方案3】:

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

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

如果你想创建一个通过realloc-ing 调整大小的数组,你需要创建一个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;
}

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

【讨论】:

  • 如果分配失败,你写的越界
【解决方案4】:

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

应使用char s[1024]; 之类的方式声明未初始化的字符数组。要创建一个已初始化的,请使用char s[1024] = "foo";char s[1024] = {'f', 'o', 'o'};

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

【讨论】:

    【解决方案5】:

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

    这样使用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2010-12-14
      • 2013-03-15
      • 1970-01-01
      • 2014-10-16
      • 2021-12-30
      • 2014-02-19
      相关资源
      最近更新 更多