C语言获取数组长度有误

C语言中,为什么在方法参数中传递的数组参数,无法通过sizeof() 获取数组参数的长度,老是返回8。

在方法参数中传递的数组参数,它退化为指针,所以用sizeof() 获取的值,就是一个指针的大小,得到 8 说明是 64 位系统,4 是 32 位系统。

因为参数位置传递的是个指针,你获取的是指针的大小而不是数组的大小
除非是字符串,字符串以0结尾,可以用strlen来获取实际长度
如果是int数组,那么你需要额外的变量传递长度

用数组长度作为额外参数

#include <stdio.h>

void printArray(int arr[], int length) {
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int length = sizeof(arr) / sizeof(arr[0]);
    printArray(arr, length);

    return 0;
}

在数组的最后一个元素设置结束标记

#include <stdio.h>

void printArray(int arr[]) {
    int i = 0;
    while (arr[i] != -1) {
        printf("%d ", arr[i]);
        i++;
    }
    printf("\n");
}

int main() {
    int arr[] = {1, 2, 3, 4, 5, -1};
    printArray(arr);

    return 0;
}
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/238542
  • 这篇博客你也可以参考下:c语言在函数中使用sizeof求数组长度
  • 你还可以看下c语言参考手册中的 c语言-sizeof
  • 除此之外, 这篇博客: 【C语言数组】数组的创建和初始化 内存中的存储 冒泡排序 sizeof 数组名中的 3.2、sizeof 计算数组的元素个数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <stdio.h>
    
    int main()
    {
    	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
    	int i = 0;
    	int sz = sizeof(arr) / sizeof(arr[0]);
    
    	for (i = 0; i < sz; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    
    	return 0;
    }
    

    // float sc[5] = { 0.0f, 3.0f };
    // 结构体数组业可以创建

    总结:
    1.数组是使用下标来访问的,下标是从0开始
    2.数组的大小可以通过计算得到。


  • 您还可以看一下 李南江老师的零基础学会C语言课程中的 sizeof运算符(掌握) 小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    在C语言中,当在方法参数中传递一个数组参数时,使用sizeof()获取数组长度时常会返回8,这是因为在函数中使用数组名作为参数时,实际上传递的是数组首元素的地址,而sizeof()操作符在这种情况下返回的是指针类型所占内存的大小。

    因此,如果要获取数组的实际长度的话,可以使用另外一个参数来传递数组长度,在方法中进行计算即可。具体实现代码如下:

    #include <stdio.h>
    
    void insertSort(int arr[], int len) {
        for (int i = 1; i < len; i++) {
            int temp = arr[i];
            int j = i;
            while (j > 0 && temp < arr[j - 1]) {
                arr[j] = arr[j - 1];
                j--;
            }
            arr[j] = temp;
        }
    }
    
    int main() {
        int arr[] = {45, 32, 56, 71, 12};
        int len = sizeof(arr) / sizeof(arr[0]);
        printf("数组的长度:%d\n", len);
    
        printf("\n排序前:\n");
        for(int i = 0; i < len; i++) {
            printf("%d ", arr[i]);
        }
    
        insertSort(arr, len);
    
        printf("\n\n经过直接插入排序后:\n");
        for(int i = 0; i < len; i++) {
            printf("%d ", arr[i]);
        }
    
        return 0;
    }
    

    在这个示例代码中,我们首先定义了一个函数 insertSort,它接受两个参数,第一个是整型数组 arr,第二个是数组长度 len。在这个函数中,我们使用插入排序算法对整型数组进行排序。而在主函数中,我们定义了一个整型数组 arr,然后使用 sizeof(arr) / sizeof(arr[0]) 的方法计算出数组的长度 len,再将这个长度作为参数传递给 insertSort 函数。

    输出结果如下:

    数组的长度:5
    
    排序前:
    45 32 56 71 12
    
    经过直接插入排序后:
    12 32 45 56 71
    

    注意,如果在函数中仍然需要获取数组的长度,可以在函数中定义一个局部变量来存储数组的长度,这样就避免了指针类型所占内存大小的问题。例如:

    void insertSort(int arr[], int len) {
        int arrLen = len; // 定义一个局部变量存储数组长度
        // 此处省略其他代码
    }
    

    总之,为了避免使用 sizeof() 获取数组长度时出现问题,可以在方法调用时传递数组的长度作为参数。