我有一个疯狂的输出和有趣的字符(Φ,w,变焦,变相,Ω,w),我能知道代码中有什么问题吗?可能int main是错误的,我不得不使用int sumArray (int * a,int len,int * sum )格式。
#include <stdio.h>
#include <stdlib.h>
int sumArray(int *a, int len, int *sum) {
int sum1 = 0;
if (a == NULL || sum == NULL)
return -1;
int i;
(*sum) = 0;
for (i = 0; i < len; i++) {
(*sum) += a[i];
}
return 0;
}
int main() {
int *a = {1, 2, 3, 4};
int *b;
sumArray(&a, 4, &b);
printf(b);
return 0;
}发布于 2020-04-10 15:16:38
你能试试这些变化吗?
#include <stdio.h>
#include <stdlib.h>
int sumArray(int *a, int len, int *sum) {
// int sum1 = 0; // i removed this variable because you are not using it
if (a == NULL || sum == NULL)
return -1;
int i;
(*sum) = 0;
for (i = 0; i < len; i++) {
(*sum) += a[i];
}
return 0;
}
int main() {
// int *a = {1, 2, 3, 4};
int a[] = {1, 2, 3, 4};
int b;
// i rather declare an integer instead of a pointer to an integer
// when you declared int * b , this was a pointer, and your printf(b) was
// printing an address, not the value calculated by sumArray that is why you
// were printing funny characters
sumArray(a, 4, &b);
// a is already a pointer
printf("%d", b);
return 0;
}发布于 2020-04-10 16:35:01
您正在使用未初始化的指针。创建指针时,不知道指针指向何处。它将指向一些垃圾数据,或者更糟糕的是,它将指向一个内存区域,该内存区域已经被计算机中的其他程序所使用,或者被操作系统本身所使用。
如果您真的想使用这样的指针,您应该动态地为它们分配内存。
int* a = malloc( 4 * sizeof(int) );
int* b = malloc( sizeof(int) );这确保可以向a指向的内存区域分配四个整数。还有一个给b。
然后,您可以在该内存中使用循环分配、读取或写入数据。
for ( int i=0; i < 4; i++ )
{
*(a + i) = i + 1;
}这里我们有一个for循环,将运行4次。每次我们在内存中移动一个街区,并把我们想要的数字放在那里。
记住,a是一个指针,它指向一个4 int大小的内存区域的开头。因此,为了进入下一个块,我们用i来抵消我们的范围。每次循环运行时,a + i都指向“数组的i第四个元素”。我们正在取消对该区域的引用,并在那里分配我们想要的值。
for ( int i=0; i < 4; i++ )
{
printf("%d\n", *(a + i) );
}在这里,我们使用相同的逻辑,但读取数据,我们只是写。
请记住,您需要使用带有printf函数的格式说明符,以使其正常工作。printf()只读取您碰巧提供给它的任何数据,而格式说明符帮助以给定的格式解释该数据。
如果在int c = 65;中使用%d格式说明符时有类似于printf的变量,则将读取数字65。如果在printf中有%c说明符,您将读字母A,其ASCII代码恰好是65。数据是相同的,但是您用格式说明符对它进行不同的解释。
现在,函数int sumArray(int *a, int len, int *sum)接受第一个参数的int指针。在主函数中,确实有一个名为a的int指针。但是您传递的是a的地址,这会导致双重间接,您传递的是一个指针的地址,该指针保存一个int数组的地址。这不是您想要的,所以函数调用中的&操作符是多余的。b也是如此。
对sumArray的调用应该类似于
sumArray( a, 4, b );
最后,我们也应该修复printf。记住我说过的格式说明符。
请记住,b不是int,而是int*,所以如果您想获得b指向的值,就需要取消引用它。
最后,调用printf应该如下所示
printf( "%d", *b );
另外,您应该记住释放使用malloc动态分配的内存。当您使用常规数组或变量时,编译器会自行处理这些内容。但是,如果动态分配内存,则无论何时完成这些指针,都必须使用free释放该内存。
在调用sumArray和b之后,您可以在终止main函数之前释放main,如
free(a);和free(b);
在这样的小项目中,释放内存可能不会导致任何不必要的结果,但这是一个非常重要的主题,关于指针,应该正确地实现,以解决更好的理解指针和更好的编程实践。
在这种形式下,您的代码应该按照您的意愿工作。
但是..。这是一个大但
正如您所看到的,为了完成这样一个简单的任务,我们花费了更多的精力而不是最优。除非您的目标是学习指针,否则这里没有使用指针和动态分配的理由。正如上面@Hayfa所演示的那样,您可以使用常规数组,并将自己从许多麻烦中解脱出来。
使用指针和动态内存是一个强大的工具,但它会带来危险。您正在处理计算机的实际物理内存。现在的编译器不会让你在试图把两个数字加在一起的时候破坏你的操作系统,但是它仍然会导致很难检测到崩溃,特别是在复杂的程序中。
(不好意思,如果很难阅读,我不一定对Stack溢出的文本编辑器有信心。)
https://stackoverflow.com/questions/61142913
复制相似问题