我正在尝试使用指针而不是数组打印指针数组,但在运行时Segmentation fault
收到此错误:
enter number of element:5
array[0]=1
array[1]=2
array[2]=3
array[3]=4
array[4]=5
Segmentation fault
这是代码:
#include <stdio.h>
#include <stdlib.h>
int *array;
int n;
void input(int *array,int n);
void display(int *array,int n);
int sum(int *array,int n);
int main (void) {
int result;
printf("enter number of element:");scanf("%d",&n);
input(array,n);
display(array,n);
result=sum(array,n);
printf("sum of array=%d",result);
return 0;
}
void input(int *array,int n){
int j;
array=(int *)malloc(n*sizeof(int));
for(j=0;j<n;j++){
printf("array[%d]=",j);scanf("%d",array+j);
}
}
void display(int *array,int n){
int j;
for(j=0;j<n;j++)
printf("%dt",*(array+j));
printf("n");
}
int sum(int *array,int n){
int sum=0,j;
for(j=0;j<n;j++)
sum+=*array+j;
return sum;
}
我怎样才能修复这个代码?请有人解释一下这个代码有什么问题。
变量array
是函数input
中的局部变量。
因此,用 array = ...
设置它是没有意义的,因为这个赋值只在函数内部生效。你通常应该把它的地址(&array
)传递给任何需要改变它的函数。
在您的特定示例中,您还有一个全局变量array
,因此快速解决问题的方法就是简单地调用函数input
,而不将变量array
作为参数传递:
void input(int n)
{
...
array = (int*)malloc(n*sizeof(int));
...
}
int main()
{
...
input(n);
...
}
请注意,这是一个"肮脏"的解决方法,您通常应努力避免使用全局变量。
要将干净的版本添加到巴拉克的答案中:
int input(int ** array, const size_t n)
{
int result = 0;
assert(NULL != array);
(*array) = malloc(n * sizeof(**array));
if (NULL == (*array))
{
result = -1;
}
else
{
size_t j;
for(j = 0; j < n; ++j)
{
printf("array[%zu]=", j);
scanf("%d", (*array) + j); /* still missing error checking here . */
}
}
return result;
}
并像这样称呼它:
if (-1 == input(&array, n))
{
perror("input() failed");
exit(EXIT_FAILURE);
}
<</div>
div class="one_answers">试试这个input()
:
void input(int **array,int n){
int j;
*array=(int *)malloc(n*sizeof(int));
for(j=0;j<n;j++){
printf("array[%d]=",j);scanf("%d",*array+j);
}
}
由于 C 使用按值传递,因此如果要更改函数中变量的值,则需要将该变量的地址作为参数传递给该函数。
在这种情况下,您想更改input()
中array
的值,并且array
的类型是 int *
,因此input()
的原型应该是类似于 void input (int **array, ...)
。
这应该可以。确保你理解其他人所说的话。
#include <stdio.h>
#include <stdlib.h>
int *array;
int n;
void input(int **array,int n);
void display(int **array,int n);
int sum(int **array,int n);
int main (void) {
int result;
printf("enter number of element:");scanf("%d",&n);
input(&array,n);
display(&array,n);
result = sum(&array,n);
printf("sum of array= %d",result);
return 0;
}
void input(int **array,int n){
int j;
*array= malloc(n*sizeof(int));
for(j=0;j<n;j++){
printf("array[%d]=",j);
scanf("%d",(*array)+j);
}
}
void display(int **array,int n){
int j;
for(j=0;j<n;j++){
printf("%dt",*((*array)+j)); // you can use array notation aswell
//array[0][j] will work
}
printf("n");
}
int sum(int **array,int n){
int sum=0,j;
for(j=0;j<n;j++){
sum += *((*array)+j);
}
return sum;
}
*array + j
做什么?它是否评估*array
并为其添加j
?还是将j
添加到数组中,然后取消引用它?如果我告诉你你错了,你愿意下注100美元吗?
通过使用括号,让你的生活和任何阅读你的代码的人的生活更轻松,或者更好的是,写数组[j]
。