数组变得比声明的大

时间:2017-05-20 11:30:59

标签: c

我正在编写一个应该将字符串拆分为" - "并返回包含字符串中部分的数组,如果该字符串为: 2017年10月23日 我希望数组有三个元素填充如下: arr [0] = 2017,arr [1] = 10,arr [2] = 23

这是功能:

/* 
 *  return a array of the parts of date_string 
 */
int * to_date_array(char *date_string)
{
        int i = 0;
        int f = 0;
        char *tokens = strtok(date_string, "-"); /* get initial token */
        static int arr[3] = {0, 0, 0};
        char *ptr;
        int val;

        /* init static arr */ 
        for (f = 0; f < sizeof(arr); f++)
                arr[f] = 0;

        /* do the split */
        while (tokens != NULL) {
                val = strtol(tokens, &ptr, 10);
                arr[i++] = val;
                tokens = strtok(NULL, "-");
        }

        /* 
         * for some reason arr becomes 12 elements long?
         * I expected it to have 3 elements
         */
        puts("func: to_date_array");
        puts("------------------------");
        for (f = 0; f < sizeof(arr); f++)
                printf("arr[%d]: %d\n", f, arr[f]);

        return arr;
}

这个功能有效,但我对#34; arr&#34;真的感到困惑。阵列。我希望它是三个元素长,但当我遍历它并打印每个元素时,它显示12个元素?

$ gcc -Wall main.c arguments.c -o timespan 
$ ./timespan 2015-08-10 2017-10-18
func: to_date_array
------------------------
arr[0]: 2015
arr[1]: 8
arr[2]: 10
arr[3]: 0
arr[4]: 0
arr[5]: 0
arr[6]: 0
arr[7]: 0
arr[8]: 0
arr[9]: 0
arr[10]: 0
arr[11]: 0

4 个答案:

答案 0 :(得分:1)

sizeof操作数返回 bytes 的大小(根据定义,char占用一个字节)。在你的(和我的)机器上,sizeof(int)是4,因此3 int的数组需要12个字节。请参阅nucleon's answer

您的to_date_array不可重入。返回动态分配的数组会更好(例如,使用calloc ....)。当然,您需要采用约定,其结果必须晚于free - d(例如,由调用者)。

您还可以考虑返回指向以flexible array member结尾的某些struct的指针。

您也可以将arr(及其长度)传递给to_date_array,然后由该函数填充。

答案 1 :(得分:1)

sizeof以字节为单位计算数组的大小,因此你必须除以单个元素的大小来得到元素的数量,因此使用

sizeof(arr)/sizeof(*arr)

答案 2 :(得分:1)

sizeof返回数组中 bytes 的数量,而不是元素的数量。在您的系统上,int宽度为4个字节,因此该数组占用12个字节。

您需要将数组的大小除以单个元素的大小以获取元素的数量:

sizeof arr / sizeof *arr

C不对数组访问进行任何边界检查 - 数组只有三个元素宽,但如果您尝试访问该范围之外的元素,则不会获得任何类型的OutOfBounds异常。行为未定义 - 您的代码可能会崩溃,可能会产生意外结果,它可能会按预期工作,但结果不一定是可重复的或可预测的。

答案 3 :(得分:0)

sizeof int arr[3]sizeof(int) * 3等于4 * 3 = 12