c/c++ | int * 例外,int 给定(返回一个指针??)

Posted

技术标签:

【中文标题】c/c++ | int * 例外,int 给定(返回一个指针??)【英文标题】:c/c++ | int * excepted, int given (returning a pointer??) 【发布时间】:2017-05-11 07:27:49 【问题描述】:

所以我正在制作一个程序来找到最大可能的减法。如果 n 为 f.e 9284,则 9284 的数字可以组成的最小数字是 2489,最大数字是 9842。函数 max_substraction 返回 9842 - 2489 作为输出。

问题是每当我运行程序并输入一个数字时,程序就会崩溃。我确实尝试过调试,但有人告诉我,函数“to_digits”除了 int * 但给出了 int,这真的很奇怪。我不是返回一个指针吗? ...

#include <stdio.h>

int valid(int);
int length(int);
int to_digits(int);
int to_num(int *, int);
void sort_digits(int *, int);
int max_substraction(int *, int);

int i,j;

int main()

    int num;
    scanf("%d", &num);
    if(!valid(num))
    
        printf("Invalid!\n");
    
    else 

        printf("%d", max_substraction(to_digits(num), length(num)));
    
    return 0;


int length(int num)

    int cpy_of_num = num, len = 0;
    do 
        cpy_of_num /= 10;
        len++;
     while(cpy_of_num != 0);

    return len;


int valid(int num)
    int len = length(num);
    if(len<2 || len>9)
        return 0;
    
    return 1;

int to_digits(int num)
    int len = length(num), cpy_of_num = num;
    int digits[len];
    for(i=len-1; i>=0; i--)
        digits[i] = cpy_of_num % 10;
        cpy_of_num /= 10;
    
    return *digits;

int to_num(int *digits, int len)
    int new_num = 0, mult = 1;
    for(i=len-1; i>=0; i--)
        new_num += digits[i]*mult;
        mult *= 10;
    
    return new_num;

void sort_digits(int *digits, int len)
    for(i=1;i<len;i++)
        for(j=0;j<len-1;j++)
            if(digits[j] > digits[j+1])
                int temp = digits[j];
                digits[j] = digits[j+1];
                digits[j+1] = temp;
            
        
    

int max_substraction(int *digits, int len)
    sort_digits(digits, len);
    int max_num_digits[10], min_num_digits[10];
    for(i=0; i<len; i++)
        min_num_digits[i] = digits[i];
        max_num_digits[i] = digits[len-i-1];
    
    int min_num = to_num(min_num_digits, len);
    int max_num = to_num(max_num_digits, len);

    return max_num - min_num;

【问题讨论】:

错误在哪一行? “to_digits”函数的返回语句? 没有“C/C++”,请选择一种语言并指定您要编译的内容。 这几乎是两者的混合 【参考方案1】:

问题出在函数调用中

  max_substraction(to_digits(num), length(num))

根据签名,

int max_substraction(int *digits, int len)

第一个参数应该是int *,但to_digits() 会返回int!!

然后,像这样的 return 语句

  return *digits;

返回int 值,而不是指针。

也就是说,即使您尝试过,在当前形式下,digits 数组也无法从 to_digits() 返回,因为它是函数的本地数组。如果你想返回 array,你需要有静态存储。现在,由于根据定义,VLA 不能具有静态存储,您可能需要使用内存分配器函数,例如 malloc() 和 family。

【讨论】:

问题是为什么 to_digits(num) 不返回 int * @Caitiff 刚刚详细说明了那部分。 谢谢你,我已经修好了!哈哈 我修正了声明 是的,Caitiff,现在解决存储问题,否则您仍然会返回一个在返回后不再存在的局部变量......另一个崩溃。【参考方案2】:

您的函数 to_digits 有一个声明为 int 的返回类型,而实际上它试图返回一个 int*。 当前形式的数组在函数结束时将不复存在,因此需要一种不同的内存分配方式才能在函数 to_digits 之外使用数组。

【讨论】:

是的,我的错。我修正了声明。 int* to_digits(int);

以上是关于c/c++ | int * 例外,int 给定(返回一个指针??)的主要内容,如果未能解决你的问题,请参考以下文章

C语言数据类型中int与short的区别

在 C / C++ 中将 int* 转换为 int(*)[n]

高精度

允许 int 宽度选择的 C/C++ 编译器

C/C++ 内存与指针

C/C++ 中的默认 int 主要参数 [重复]