ポイントするためのメモリを割り当てていないptr
ため、答えは避けられません。自動配列へのポインターを返すことができないように、メモリが十分に長く続くことを確認する必要があります。静的配列を用意する必要があります (ただし、十分に大きくするにはどうすればよいでしょうか)。または、メモリを動的に割り当てて ( malloc()
et al)、呼び出し元のコードが割り当てられたものを解放するようにする必要があります。
アルゴリズムの問題もあります。すべての行のすべての値を 1 つの値に累積していますが、行ごとに個別の値を計算する必要があります。
また、*ptr
ですfloat
。return ptr;
タイプを正しくするだけで済みます。
関数名も異なる必要があります。
#include <stdio.h>
#include <stdlib.h>
enum { COL = 7 };
float *row_sums(float array[][COL], int rows)
{
float *ptr = malloc(rows * sizeof(*ptr));
if (ptr != 0)
{
for (int i = 0; i < rows; i++)
for (int j = 0; j < COL; j++)
ptr[i] += array[i][j];
}
return ptr;
}
int main(void)
{
float data[][COL] = { { 1.0 }, { 2.0 }, { 0.0, 3.0 }, { -1.0, -2.0 } };
float *result = row_sums(data, 4);
for (int i = 0; i < 4; i++)
printf("%d: %.1f\n", i, result[i]);
free(result);
return(0);
}
の使用は4
最適ではありません。のようなものにする必要がありますROWS
。ここで、次を使用して定義されています。
enum { ROWS = sizeof(data) / sizeof(data[0]) } ;