求和函数的有趣字符输出(Φ;wÅ;Ω;w)

求和函数的有趣字符输出(Φ;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

我有一个疯狂的输出与有趣的字符(Φ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
您能试试这些更改吗

#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) );
}