gpt4 book ai didi

c - 在 C 中计算数组中字符串元素数量的正确方法

转载 作者:太空宇宙 更新时间:2023-11-04 07:11:58 26 4
gpt4 key购买 nike

这是我正在处理的代码。

#include <stdio.h>

int main(int argc, char *argv[])
{
int i=0;

for(i=1;i<argc;i++){
printf("arg %i: %s\n", i , argv[i]);
}

//custom array of strings
char *states[] = {
"California", "Oregon", "Idaho", "Arkansas", "Washington",
"Texas", "Montana"
};
int num_states = sizeof(*states)-1;
printf("%i\n", num_states);
for(i=0;i<num_states;i++){
printf("state %i: %s\n", i, states[i]);

}

return 0;
}

我的问题很简单,在我完成这项工作之前,我遇到了一个非常令人沮丧的段错误。

int num_states = sizeof(*states)-1;”这一行用于返回数组中字符串的数量减一(不确定为什么需要 -1 来防止段错误)

int num_states = sizeof(states);”返回 56,并导致我的 for 循环遍历不存在的内容。

问题是我不确定有什么区别。我最好的猜测是第一行计算 states[] 组成的字节总数,第二行计算 *states 存储在内存中的位置数>.

如果我的想法不对请指正。如果你能告诉我为什么 -1 以某种方式阻止了这个段错误,我将不胜感激。

最佳答案

正确的做法

num_states 中的值应该是:

int num_states = sizeof(states) / sizeof(states[0]);

也就是说,数组中元素的数量是数组的大小除以数组第零个元素的大小(它与数组中所有其他元素的大小相同)。

这可以推广到处理其他数组。回到 Fortran 和/或 Basic,我经常使用宏:

#define DIM(x) (sizeof(x)/sizeof(*(x)))

注意:这只适用于大小已知的数组。它不适用于传递给函数的“数组”;这样的“数组”退化为指针,您最终会得到错误的答案。如果您在当前源文件中(在任何函数之外)或在当前函数中定义了该函数,则可以安全地使用它。

为什么你的代码有效

至于您的示例为何有效——答案是“巧合”。这取决于以下事实:

  • 您的数组有 7 个元素。
  • 指针的大小在您的系统上是 8 个字节。

sizeof(*states) 的值为 8 因为 *states 是一个 char * 并且(在您的 64 位机器上) ,指针的大小为 8。因此 int num_states = sizeof(*states)-1; 巧合地“有效”。如果您在数组中添加或删除任何条目,或在 32 位机器上编译代码,那么它将再次失败(失败的确切模式取决于环境的变化),而计算元素的数量如下所示无论这些更改如何,都会正常工作。

关于c - 在 C 中计算数组中字符串元素数量的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27672618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com