求和函数的有趣字符输出(Φ;wÅ;Ω;w)
我有一个疯狂的输出与有趣的字符(ΦwÅΩw)我可以知道什么是错误的代码? 可能int main是错误的 我必须使用int-sumArray(int*a,int-len,int*sum)格式求和函数的有趣字符输出(Φ;wÅ;Ω;w),c,arrays,pointers,C,Arrays,Pointers,我有一个疯狂的输出与有趣的字符(ΦwÅΩw)我可以知道什么是错误的代码? 可能int main是错误的 我必须使用int-sumArray(int*a,int-len,int*sum)格式 #包括 #包括 int-sumArray(int*a,int-len,int*sum){ int sum1=0; if(a==NULL | | sum==NULL) 返回-1; int i; (*和)=0; 对于(i=0;i
#包括
#包括
int-sumArray(int*a,int-len,int*sum){
int sum1=0;
if(a==NULL | | sum==NULL)
返回-1;
int i;
(*和)=0;
对于(i=0;i
您能试试这些更改吗
#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;
}
#包括
#包括
int-sumArray(int*a,int-len,int*sum){
//int sum1=0;//我删除了这个变量,因为您没有使用它
if(a==NULL | | sum==NULL)
返回-1;
int i;
(*和)=0;
对于(i=0;i
您能试试这些更改吗
#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;
}
#包括
#包括
int-sumArray(int*a,int-len,int*sum){
//int sum1=0;//我删除了这个变量,因为您没有使用它
if(a==NULL | | sum==NULL)
返回-1;
int i;
(*和)=0;
对于(i=0;i
您正在使用未初始化的指针。创建指针时,您不知道指针指向何处。它或者指向一些垃圾数据,或者在更糟糕的情况下,它将指向一个内存区域,该内存区域已经被计算机中的其他程序或操作系统本身使用
如果您真的想使用这样的指针,您应该动态地为它们分配内存
int* a = malloc( 4 * sizeof(int) );
int* b = malloc( sizeof(int) );
这确保您可以为a
指向的内存区域分配四个整数。一个用于b
然后,您可以使用循环在内存中漫游以分配、读取或写入数据
for ( int i=0; i < 4; i++ )
{
*(a + i) = i + 1;
}
在这里,我们使用相同的逻辑,但读取数据,我们只是写
请记住,您需要将格式说明符与printf
函数一起使用,以使其正常工作printf()
只要读取您碰巧提供给它的任何数据,格式说明符就会帮助以给定格式解释该数据
如果你有一个变量,比如intc=65
当您在printf
中使用%d
格式说明符时,您将读取数字65。如果printf中有%c
说明符,则将读取字母A,其ASCII代码恰好为65。数据是相同的,但使用格式说明符对其进行不同的解释
现在,函数intsumarray(int*a,int len,int*sum)
接受第一个参数的int指针。在main函数中有一个名为a
的int指针。但是您传递的是a的地址,这会导致双间接寻址,您传递的是保存int数组地址的指针的地址。这不是您想要的,因此函数调用中的&
运算符是多余的。与b
相同
调用sumArray
应该如下所示
summarray(a,4,b)代码>
最后,我们还应该修复printf
。还记得我说过的格式说明符吗
请记住,b
不是int
,而是int*
,因此如果要获取b
所指向的值,需要取消对其的引用
最后,调用printf
应该如下所示
printf(“%d”,*b)代码>
另外,您应该记住释放使用malloc动态分配的内存。当您使用规则数组或变量时,编译器会自行处理这些内容。但如果动态分配内存,则必须使用free
释放内存,无论何时使用这些指针
您可以在调用sumArray
后释放a
,在终止main
函数之前释放b
,如
免费(a)代码>和免费(b)代码>
在这些小型项目中,释放内存可能不会导致任何不必要的结果,但这是关于指针的一个非常重要的主题,应该正确实现,以便更好地理解指针和更好的编程实践
在这种形式下,您的代码应该按照预期工作
但是。。。这是一个巨大但
正如你们所看到的,为了完成这样一项简单的任务,我们付出的努力远远超过了最优。除非您的目标是学习指针,否则这里没有理由使用指针和动态分配。您可以像上面@Hayfa演示的那样使用规则数组,从而避免很多麻烦
使用指针和动态内存是一个强大的工具,但也会带来危险。您正在使用计算机的实际物理内存。现在的编译器不允许您在尝试将两个数字相加时破坏操作系统,但它仍然会导致难以检测的崩溃,尤其是在复杂的程序中
(对不起,如果很难阅读,我不是nec
for ( int i=0; i < 4; i++ )
{
printf("%d\n", *(a + i) );
}