【问题标题】:Improved method to obtain the size of an array获取数组大小的改进方法
【发布时间】:2017-03-12 23:49:56
【问题描述】:

我做了一个函数,它接收一个字符数组的指针,表示一个十六进制数,并返回它的十进制值。

在那个函数中,这是我目前用来获取数组大小的函数

size_t iSize = 0;
while (s[iSize] != '\0'){   iSize++;    }

我正在寻找一种更好的方法来做到这一点。 我已经尝试过 int `iSize = sizeof(s)/sizeof(s[0])。

【问题讨论】:

  • 要查找空终止字符串的长度,请使用strlen。根据您的描述,这是您关心的,而不是数组的大小。
  • 您是否考虑过用一个函数strtol 替换整个将十六进制字符串转换为数字的函数?
  • size_t iSize = strlen(s); ?

标签: c


【解决方案1】:

数组的大小没有通过函数传递。示例:

int my_getsize(int* ptr)
{
    return sizeof(ptr);
}

int main()
{
    int arr[100];
    printf("%d\n", sizeof(arr)); //output: 400
    printf("%d\n", my_getsize(arr)); //output: 4
}

在 32 位系统中,my_getsize(buf) 返回 4,即指针的大小。而sizeof(buf) 返回 400,即 100 * sizeof(int)(也是 4)。解决这个问题的唯一方法是将数组大小传递给函数。例如foo(arr, sizeof(arr)/sizeof(arr[0]))

字符数组是一种特殊情况,因为字符串以空值结尾,您可以在数组中查找最后一个零。但是请注意,这不会返回包含空终止符的数组大小。与strlen 相同。示例:

size_t my_strlen(char* ptr)
{
    size_t iSize = 0;
    while (*ptr++) iSize++;
    return iSize;
}

对于char buf[] = "12345"sizeof(buf) 为 6,而strlen(buf) 为 5。通常您不必担心使用此类简单函数进行优化,因为编译器会为您完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多