我正在實施一個程式來劃分a陣列中的所有值,100然后b使用malloc. 問題是我在列印bin值時遇到了分段錯誤main。
這是我的代碼
#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;
}
那么是什么導致了這個問題以及如何解決它?
提前致謝。
uj5u.com熱心網友回復:
您正在按值將指標 b 傳遞給函式除法
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;
}
在主要你可以寫
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 );
uj5u.com熱心網友回復:
函式split接收的是指標b的副本。這意味著函式main中的變數b在呼叫后不變。一個更簡單的例子來說明這一點是
void f(int n)
{
n = 1;
}
在呼叫f之后,呼叫方的n不變。
對代碼的最簡單更正是使Division接收指向指標b的指標。劃分的簽名將是
void divide(int *a, int n, double **b);
但是,最好在同一個函式中分配和釋放記憶體,因為很容易忘記除法分配記憶體。在處理陣列時,我總是使用兩個方便的宏函式 NEW_ARRAY 和 LEN 來簡化代碼。下面是我的建議。如果長度一個被改變的代碼的其余部分將很好地遵循。
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN(array) (sizeof (array) / sizeof (array)[0])
#define NEW_ARRAY(pointer, length) \
{ \
(pointer) = malloc(((size_t) length) * sizeof (pointer)[0]); \
if ((pointer) == NULL) { \
fprintf(stderr, "Allocating memory with malloc failed: %s\n", strerror(errno)); \
exit(EXIT_FAILURE); \
} \
}
void divide(int *a, int n, double *b)
{
for (int i = 0; i < n; i ) {
b[i] = a[i] / 100.0;
}
}
int main(void)
{
int a[] = {1, 2, 3, 4, 5};
double *b;
NEW_ARRAY(b, LEN(a));
divide(a, LEN(a), b);
for (size_t i = 0; i < LEN(a); i ) {
printf("%.2f ", b[i]);
}
printf("\n");
free(b);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386858.html
下一篇:鏈表始終為NULL
