C - 返回数组不起作用
C - Returning array not working
我正在尝试获取一个长数字,计算它有多少位数字,然后取该数字的倒数第二位并将其乘以 2,然后遍历数字的其余部分,将每个第二位相乘,然后相加它到一个数组。如果你们知道我在说什么,那就是cs50的信用卡问题集。
当我制作程序时它抛回了这个错误:
error: format specifies type 'long' but the argument has type '<dependent type>' [-Werror,-Wformat]
credit.c:22:21: error: use of undeclared identifier 'array'
printf("%ld\n", array);
^
credit.c:40:8: error: incompatible pointer to integer conversion returning 'long [nDigits]' from a function with result type 'long' [-Werror,-Wint-conversion]
return array;
^~~~~
3 errors generated.
make: *** [credit] Error 1
代码:
#include <cs50.h>
#include <stdio.h>
#include <math.h>
long find_2ndlast_nums(long x);
int main(void)
{
long n;
long nDigits;
do
{
n = get_long_long("Please enter your credit card number:\n");
nDigits = floor(log10(labs(n))) + 1;
}
while (nDigits < 13 || nDigits > 16);
find_2ndlast_nums(n);
printf("%ld\n", array);
}
long find_2ndlast_nums(long x)
{
long nDigits = floor(log10(labs(x))) + 1;
long array[nDigits];
for (int y = 1; y < nDigits; y += 2)
{
x = (fmod((floor(x / 10 ^ y)), 10)) * 2;
array[nDigits - y] = x;
}
return array;
}
这里有两个问题:
当你在 C 中声明一个类型为 [count] 的数组时,它是在堆栈上分配的。一旦你的函数 returns,当前堆栈帧上的所有内容都会变得无效,所以你不能 return 像这样的堆栈分配数组。
即使您可以 return 该数组,您也将函数声明为 returning 一个 long,而不是指向 long 的指针,因此签名不正确。
我要做的是使用 malloc 为堆上的数组分配内存。将函数声明为 returning 指针,然后 return 指向数组的指针。不幸的是,调用函数必须记住之后释放指针,否则会发生内存泄漏,但这只是使用 C 时遇到的问题之一。
所以,像这样:
long *myFunc() {
long *array = malloc(count * sizeof(long));
// populate the array
return array;
}
并且在客户端中:
long *array = myFunc();
// do something with array, and when you're done:
free(array);
或者,如果您可以提前知道数组的最大大小,则可以让该函数填充一个已分配的数组。这样做的好处是让您的 malloc 和 free 出现在同一范围内,从而使代码更清晰。另外,如果数组不需要离开调用函数,调用函数可以在堆栈上分配数组并将其传入,从而完全不需要 malloc 和 free。
void populateArray(long *array, size_t arraySize) {
// populate array. Don't write more than arraySize objects
// or you'll cause a buffer overflow.
}
我正在尝试获取一个长数字,计算它有多少位数字,然后取该数字的倒数第二位并将其乘以 2,然后遍历数字的其余部分,将每个第二位相乘,然后相加它到一个数组。如果你们知道我在说什么,那就是cs50的信用卡问题集。
当我制作程序时它抛回了这个错误:
error: format specifies type 'long' but the argument has type '<dependent type>' [-Werror,-Wformat]
credit.c:22:21: error: use of undeclared identifier 'array'
printf("%ld\n", array);
^
credit.c:40:8: error: incompatible pointer to integer conversion returning 'long [nDigits]' from a function with result type 'long' [-Werror,-Wint-conversion]
return array;
^~~~~
3 errors generated.
make: *** [credit] Error 1
代码:
#include <cs50.h>
#include <stdio.h>
#include <math.h>
long find_2ndlast_nums(long x);
int main(void)
{
long n;
long nDigits;
do
{
n = get_long_long("Please enter your credit card number:\n");
nDigits = floor(log10(labs(n))) + 1;
}
while (nDigits < 13 || nDigits > 16);
find_2ndlast_nums(n);
printf("%ld\n", array);
}
long find_2ndlast_nums(long x)
{
long nDigits = floor(log10(labs(x))) + 1;
long array[nDigits];
for (int y = 1; y < nDigits; y += 2)
{
x = (fmod((floor(x / 10 ^ y)), 10)) * 2;
array[nDigits - y] = x;
}
return array;
}
这里有两个问题:
当你在 C 中声明一个类型为 [count] 的数组时,它是在堆栈上分配的。一旦你的函数 returns,当前堆栈帧上的所有内容都会变得无效,所以你不能 return 像这样的堆栈分配数组。
即使您可以 return 该数组,您也将函数声明为 returning 一个 long,而不是指向 long 的指针,因此签名不正确。
我要做的是使用 malloc 为堆上的数组分配内存。将函数声明为 returning 指针,然后 return 指向数组的指针。不幸的是,调用函数必须记住之后释放指针,否则会发生内存泄漏,但这只是使用 C 时遇到的问题之一。
所以,像这样:
long *myFunc() {
long *array = malloc(count * sizeof(long));
// populate the array
return array;
}
并且在客户端中:
long *array = myFunc();
// do something with array, and when you're done:
free(array);
或者,如果您可以提前知道数组的最大大小,则可以让该函数填充一个已分配的数组。这样做的好处是让您的 malloc 和 free 出现在同一范围内,从而使代码更清晰。另外,如果数组不需要离开调用函数,调用函数可以在堆栈上分配数组并将其传入,从而完全不需要 malloc 和 free。
void populateArray(long *array, size_t arraySize) {
// populate array. Don't write more than arraySize objects
// or you'll cause a buffer overflow.
}