我知道两种获取常量字符长度的方法*
const char * str = "Hello World !";
int Size = 0;
while (str[Size] != '\0') Size++;另一种方法很简单
const char * str = "Hello World !";
size_t Size = strlen(str);但是我不想使用像strlen这样的str lib函数,我认为这个函数也使用了我的第一种方式行为。因为在pc世界中,当我们想要计算一些东西时,我们需要计算每个块的长度,并且没有魔法可以通过一个动作来获得长度,所以我认为第一种方法是获得const char *长度的最佳选择。另外,我认为第一种方法可能对重的弦来说太重了,所以我很困惑。哪种方法更好,为什么其他方法不好?
发布于 2021-04-06 23:23:26
晚了3年,但迟了总比不到好。
简短的回答
#define length(array) ((sizeof(array)) / (sizeof(array[0])))长长的答案
所以使用sizeof(array)会返回the size of the type of the array * the amount of elements。了解了这一点,我们可以实现以下目标:
#define length(array) ((sizeof(array)) / (sizeof(array[0])))您可以像这样使用它:
type yourArray[] = {your, values};
length(yourArray); // returns length of yourArray例如:
#include <stdlib.h>
#include <stdio.h>
#define length(array) ((sizeof(array)) / (sizeof(array[0])))
int main()
{
const char *myStrings[] = {"Foo", "Bar", "Hello, World!"}; // 3 elements
int myNums[] = {0, 1, 5, 7, 11037}; // 5 elements
char myChars[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'}; // 7 elements
printf("Length of myStrings array: %lu\n", length(myStrings));
printf("Length of myNums array: %lu\n", length(myNums));
printf("Length of myChars array: %lu\n", length(myChars));
return 0;
/* Output:
Length of myStrings array: 3
Length of myNums array: 5
Length of myChars array: 7 */
}我测试了它,它也适用于未初始化的数组,可能是因为它们包含来自同一类型的垃圾(来自未初始化)。整数未初始化数组包含随机整数,且常量char*未初始化数组包含(null),它被视为常量char*。
现在,这只适用于堆栈上的数组。指向用作数组的堆中保留的空间的指针将产生意外的结果。例如:
int *myNums = (int *)malloc(3 * sizeof(int)); // Space for 3 integers
printf("Length of myNums: %lu\n", length(myNums)); // Outputs 2 instead of 3因此,请注意。不管怎样,谁在堆上使用数组呢?
注意:这与这个问题相关,因为它可以根据请求与const char *一起使用。也可以与其他类型一起使用。
https://stackoverflow.com/questions/44690087
复制相似问题