gpt4 book ai didi

c - 将数组 segmentation 为较小的数组不会返回正确的结果

转载 作者:行者123 更新时间:2023-11-30 16:08:50 26 4
gpt4 key购买 nike

用户提供 2 个参数,n-将存储在数组中的浮点元素数量,w-包含 segmentation 数组部分的行数。如果n%w等于0,则在数组之间均匀分配元素,否则最后一个数组包含+n%w个元素。我的代码总是显示适当数量的行,但我不知道为什么对于 n%w=0 它总是显示一行中的 4 个元素,这通常最终会打印 0.000000 。对于 n%w=1 发生段错误。我正在 Linux 中的 nano 编辑器中编写我的程序。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <time.h>
int main(char argc, char* argv[]) {

//checking if user provided 2 arguments
if (argc != 3) {
printf("Wrong number of arguments !\n");
return 1;
}

int n, w;
sscanf(argv[1], "%d", &n);
sscanf(argv[2], "%d", &w);
//creating an array that will contain float values that we will use later on
float* myarray = (float*)malloc(n);

srand(0);
for (int i = 0; i < n; i++) {
myarray[i] = 1000. * rand() / RAND_MAX;
}

float** doublearray = (float**)malloc(w * sizeof(float*));
int columns = n / w;
int modulo = n % w;

//if n%w equals zero, distribute values equaly between rows
if (modulo == 0) {
for (int i = 0; i < w; i++) {
doublearray[i] = (float*)malloc(columns * sizeof(float));
}
}
//if n%w does not equal zero, increase last row size by modulo
else {
for (int i = 0; i < w - 1; i++) {
doublearray[i] = (float*)malloc(columns * sizeof(float));
}
doublearray[w] = (float*)malloc((columns + modulo) * sizeof(float));
}

//distributing elements in 2 dimensional array
int number = 0;
for (int i = 0; i < w; i++) {
for (int j = 0; j < sizeof(doublearray[i]); j++) {
doublearray[i][j] = myarray[number];
number++;
}
}

//printing out the result
for (int i = 0; i < w; i++) {
for (int j = 0; j < sizeof(doublearray[i]); j++) {
printf("%f", doublearray[i][j]);
printf(" "); printf(" ");
}
printf("\n");
}

return 0;
}

这是参数 n=10,w=5 的结果

840.187744 394.382935 783.099243 798.440063

911.647339 197.551376 335.222748 768.229614

277.774719 553.969971 0.000000 0.000000

0.000000 0.000000 0.000000 0.000000

0.000000 0.000000 840.187744 0.000000

但应该是

840.187744 394.382935

783.099243 798.440063

911.647339 197.551376

335.222748 768.229614

277.774719 553.969971

最佳答案

对于此代码片段中的初学者

else {
for (int i = 0; i < w - 1; i++) {
doublearray[i] = (float*)malloc(columns * sizeof(float));
}
doublearray[w] = (float*)malloc((columns + modulo) * sizeof(float));
}

使用了无效索引w。数组索引的有效范围是[0, w)

所以你必须写

    doublearray[w-1] = (float*)malloc((columns + modulo) * sizeof(float));

这个循环

for (int j = 0; j < sizeof(doublearray[i]); j++) {

没有意义。表达式doublearray[i]的类型是float *。因此,sizeof( float * ) 不会生成一维数组的分配元素数量。

我确信有几种方法可以组织循环。我可以建议下面的程序中演示的方法。

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

int main(void)
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const size_t M = sizeof( a ) / sizeof( *a );
const size_t N = 3;

int **b = malloc( M / N * sizeof( int * ) );
for ( size_t i = 0; i < M / N; i++ )
{
size_t n = M - ( i + 1 ) * N < N ? N + M % N : N;
b[i] = malloc( n < sizeof( int ) );
}

for ( size_t i = 0; i < M / N; i++ )
{
size_t n = M - ( i + 1 ) * N < N ? N + M % N : N;
for ( size_t j = 0; j < n; j++ ) b[i][j] = a[N * i + j];
}


for ( size_t i = 0; i < M / N; i++ )
{
size_t n = M - ( i + 1 ) * N < N ? N + M % N : N;
for ( size_t j = 0; j < n; j++ ) printf( "%d ", b[i][j] );
putchar( '\n' );
}

for ( size_t i = 0; i < M / N; i++ )
{
free( b[i] );
}

free( b );

return 0;
}

程序输出为

0 1 2 
3 4 5
6 7 8 9

关于c - 将数组 segmentation 为较小的数组不会返回正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59252278/

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