我想计算(最初)未初始化的char数组的长度。
我的代码是:
#include <stdio.h>
int main()
{
char *string_t;
int loc = sizeof(string_t)/sizeof(*string_t);
printf("%d", loc);
}
我希望loc
为0
,而loc
为8.有人可以告诉我为什么会这样,以及如何“修复”这个是我期望的答案?< / p>
答案 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);