桥驿听雨落 发表于 2022-2-25 19:11:49

一个求和的算法,为什么数组长度的表示方法失效了?

用数字5,能输出正确结果
但用sizeof就不行,用调试看了下总在i,j=2处结束
主函数里printf输出也是正确的
求解。。。

桥驿听雨落 发表于 2022-2-25 19:28:43

{:10_266:}

ba21 发表于 2022-2-25 19:37:32

int sum(int *a) a是一个指针,32位int在这sizeof(a) 是4

人造人 发表于 2022-2-25 19:40:45

$ cat main.c
#include <stdio.h>

void func(int *a) {
    printf("func: %lu\n", sizeof(a));
}

int main(void) {
    int a[] = {1, 2, 3, 4};
    printf("main: %lu\n", sizeof(a));
    func(a);
    return 0;
}
$ gcc-debug -o main main.c
$ ./main
main: 16
func: 8
$

isdkz 发表于 2022-2-25 19:47:07

本帖最后由 isdkz 于 2022-2-25 19:48 编辑

因为在 sum 函数中传进去的参数是 a 的指针,

a 的指针占了 8 个字节,然后除以 a,a 是一个整数,占4 个字节,

结果是 2,所以在 sum 函数里面 sizeof(a)/sizeof(a) 得出来的是 2。验证代码:
#include<stdio.h>
int sum(int* a);

int main(){
        int a[] = {2, 3, 4, 1, -2,};
        printf("%d\t", sum(a));
        printf("size_a: %d\t", sizeof(a));       # 打印 a 数组占的字节数
        printf("size_&a: %d\t", sizeof(&a));   # 打印 a 数组的指针占的字节数
        printf("size_a: %d\t", sizeof(a));   # 打印 a 占的字节数
        printf("%d", sizeof(a)/sizeof(a));
        return 0;
}

int sum(int *a){
        int i, j, k, sum1 = 0, maxsum = 0;
        for(i = 0; i<sizeof(a)/sizeof(a); i++){
                for(j = 0; j<sizeof(a)/sizeof(a); j++,sum1=0){
                        for(k = i; k<=j; k++){
                                sum1 = sum1 + a;
                        }
                        if(sum1 > maxsum)
                        maxsum = sum1;
                }
        }
        return maxsum;
}
页: [1]
查看完整版本: 一个求和的算法,为什么数组长度的表示方法失效了?