gpt4 book ai didi

c - 在 c 中使用 malloc 进行操作时出现段错误

转载 作者:行者123 更新时间:2023-12-02 01:50:33 25 4
gpt4 key购买 nike

我正在实现一个程序,将a数组中的所有值除以100,然后使用malloc<将它们存储在b数组中。问题是在 main 中打印 b 的值时出现段错误。

这是我的代码

#include <stdio.h>
#include <stdlib.h>

void divide(int *a, int n, double *b){
b=malloc(n*sizeof(double));

for(int i=0; i<n; i++){
b[i]=(double)a[i]/100.0;
}

//check: values still remain in b
for (size_t i = 0; i < 5; i++)
{
printf("%.2f ", b[i]);
}
}

int main(){
int a[]={1,2,3,4,5};
double *b;

divide(a,5,b);

//check: lost value and cause segmentation fault
for (size_t i = 0; i < 5; i++)
{
printf("%.2f ", b[i]);
}
free(b);
return 0;
}

那么是什么原因导致这个问题以及如何解决它呢?

提前致谢。

最佳答案

您正在将指针 b 按值传递给函数 div

divide(a,5,b);

该函数处理原始指针的副本。更改副本不会影响原始指针。

您需要通过指向它的指针通过引用传递指针,或者重新设计函数,使其返回指向函数内动态分配的内存的指针。

例如,可以按以下方式声明和定义函数

double * divide( const int *a, size_t n )
{
double *b = malloc( n * sizeof( double ) );

if ( b != NULL )
{
for ( size_t i = 0; i < n; i++ )
{
b[i] = a[i] / 100.0;
}

//check: values still remain in b
for ( size_t i = 0; i < n; i++ )
{
printf("%.2f ", b[i]);
}
}

return b;
}

在 main 中你可以写

double *b = divide( a, sizeof( a ) / sizeof( *a ) );

否则该函数可能看起来像

void divide( const int *a, size_t n, double **b )
{
*b = malloc( n * sizeof( double ) );

if ( *b != NULL )
{
for ( size_t i = 0; i < n; i++ )
{
( *b )[i] = a[i] / 100.0;
}

//check: values still remain in b
for ( size_t i = 0; i < n; i++ )
{
printf("%.2f ", ( *b )[i]);
}
}
}

并称其为

divide( a, sizeof( a ) / sizeof( *a ), &b );

关于c - 在 c 中使用 malloc 进行操作时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70402246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com