c - 浏览结构数组并存储值无法正常工作

标签 c structure

我的代码非常困惑,有两个结构,定义和初始化都相同。但是,对于 tall 结构,我可以在结构 tall[radius] 中存储变量,没有任何问题。但是当我复制 xx 结构的过程时,它无法打印错误的值。 我似乎无法弄清楚结构使用有什么问题。

我需要一个结构数组来每次动态存储不同大小的数组,并稍后为每个结构存储其他元素。

我也对新方法持开放态度。 为什么这两个结构的性能不同?

#include <stdio.h>
#include <stdlib.h>
#define ar_length 18 //this is the radius max
#define WIDTH 10     //xx width
struct ttall
{
    int *pnt;
};
struct xall
{
    int *pnt;
};
int main()
{
    int i;

    int m;

    int *x1;
    int *x2;
    int *x3;
    int *ttThis;
    int rad_size;


    //beginning of the loop
        int radius = 1;
        int size = (2 * radius + 1);
        int size_sqrd = size * size * size;

        struct ttall **tall = malloc(sizeof(struct ttall *));
        struct ttall *struct_pnt = malloc( 3*sizeof(struct ttall));
        struct xall **xx = malloc(sizeof(struct xall *));
        struct xall *xpnt = malloc( 3*sizeof(struct xall));





    for (int radius = 0; radius < 3; radius++)
    {
        //need to increment the pointer to the struct everytime
        xx[radius] = xpnt+radius;
        tall[radius] = struct_pnt+radius;
        int z = -1;
        int t = -radius-2;
        printf("****T*** %d\n",t);
        int rad;
        int meshCount;
        meshCount = (2 * (radius+1) + 1);
        rad_size = (2 * (radius+1) + 1) * (2 * (radius+1) + 1) * (2 * (radius+1) + 1);
        printf("radius size : %d\n",rad_size);
        printf("mesh size : %d\n",meshCount);
        tall[radius]->pnt = malloc(rad_size * sizeof(int));
        xx[radius]->pnt = malloc(rad_size * WIDTH * sizeof(int));
        x1 = malloc(rad_size * sizeof(int));
        x2 = malloc(rad_size * sizeof(int));
        x3 = malloc(rad_size * sizeof(int));


        for (i = 0; i < meshCount; i++)
        {
            t++;
            z++;
            for (m = 0; m < meshCount*meshCount; m++)
            {
                x1[z * (meshCount*meshCount) + m] = t;
            }
        }

        //x2 computations
        i = 0;
        m = 0;
        z = 0;
        t = -radius-2;
        int x;

        for (x = 0; x < meshCount; x++)
        {
            t++;
            for (m = 0; m < meshCount; m++)
            {
                for(int h = 0;h<meshCount;h++){
                int index = meshCount*x+(meshCount*meshCount)*h +m ;
                x2[index] = t;

            }
            }
        }

    //x3 computations
        i = 0;
        m = 0;
        z = 0;
        t = -radius-2;

        for (x = 0; x < meshCount; x++)
        {
            //  t++;
            t = -radius-2;
            for (m = 0; m < meshCount; m++)
            {
                t++;
                for(int h = 0;h<meshCount;h++){

                int index = meshCount*x+(meshCount*meshCount)*h +m ;
                x3[index] = t;
                }
            }
        }




        // structure initializations and memalocation
        //works fine with expanding radius
        for (m = 0; m < rad_size; m++)
        {
            tall[radius]->pnt[m] = (x1[m] * x1[m]) + (x2[m] * x2[m]) + (x3[m] * x3[m]);
        }


        // doesnt work here 
            m = 0;
            for (i = 0; i < rad_size; i++)
            {
                xx[radius]->pnt[i * WIDTH ] = 1;
                xx[radius]->pnt[i * WIDTH + 1] = x1[i];
                xx[radius]->pnt[i * WIDTH + 2] = x2[i];
                xx[radius]->pnt[i * WIDTH + 3] = x3[i];
                xx[radius]->pnt[i * WIDTH + 4] = x1[i] * x1[i];
                xx[radius]->pnt[i * WIDTH + 5] = x1[i] * x2[i];
                xx[radius]->pnt[i * WIDTH + 6] = x1[i] * x3[i];
                xx[radius]->pnt[i * WIDTH + 7] = x2[i] * x2[i];
                xx[radius]->pnt[i * WIDTH + 8] = x2[i] * x3[i];
                xx[radius]->pnt[i * WIDTH + 9] = x3[i] * x3[i];


            }
    }


    //free(x1);
    //free(x2);
    //free(x3);

    //***testing sum***
// the sum when radius = 1 of xx should be 171 
    int k = 0;
    int sum = 0;
    //can replace 27 with rad_size
    for (k = 0; k < 27*WIDTH; k++)
    {
        sum = sum + abs(xx[0]->pnt[k]);
        //printf("%d\n",abs(xx[0]->pnt[k]));
    }
    printf(" sum xx : %d\n", sum);
    //******Testing****


    for (int c = 0; c < 27; c++)
    {
        //printf("X2 : %d\n",x3[c]);
        printf("tall : %d\n", tall[1]->pnt[c]);
        //printf("%d\n",xx[c]);
    }


    //free(ttThis);
    //free(xx);
}

最佳答案

struct ttall **tall = malloc(sizeof(struct ttall *));您为一个指针分配空间。

但后来你用 tall[radius] 对其进行索引但半径大于1。

您必须分配更多内存:

struct ttall **tall = malloc(3 * sizeof(struct ttall *));`

关于c - 浏览结构数组并存储值无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55673998/

相关文章:

c - 我要打印什么地址?

c - 内存地址和内存地址中的值

c - 在这种情况下,通过指针或通过值传递结构有什么区别?

c - 指针初始化不会产生稳定的结果

c - 随机排列 AVX 寄存器中的元素

c - 修改c socket程序从服务器向客户端发送文件

c - C 中指向结构体的双指针有什么用?

调用由结构体数组中的函数指针成员指向的函数

Java - 强制执行已实现的方法

ios - 何时在 Swift 中从 firebase 获取数据(iOS 开发者)