struct-如何解决C语言给结构体当中的数组分配堆空间的问题

问题描述

如何解决C语言给结构体当中的数组分配堆空间的问题

#include
#include
struct A{
int num[3];
};

int main()
{
int i,j;
struct A *a = (struct A *)calloc(3,sizeof(struct A));
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
a[i].num[j] = (int *)calloc(1,sizeof(int));
}
for(i=0;i<3;i++)
free(a[i].num[j]); //编译器编译显示这里出错
free(a);
return 0;
}

解决方案

int _tmain(int argc, _TCHAR* argv[])
{
    int i,j;
    struct A *a = (struct A *)calloc(3,sizeof(struct A));
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            int * ptr = (int *)calloc(1,sizeof(int));
            a[i].num[j] = (int)ptr;
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            free((int*)a[i].num[j]); //编译器编译显示这里出错
        }
    }
    free(a);
    return 0;
}

你这问题陷阱太多了:)
我是按照你想在num数组中存储指针处理的。

解决方案二:

分配堆空间用malloc

free(a[i].num[j]);
->
free(a[i].num[0]);
free(a[i].num[1]);
free(a[i].num[2]);

解决方案三:

struct A{
int num[3];
};
中num是数组,不用分派空间,给A分派空间后num自然就有了。
a[i].num[j]是数组值,不是指针,free肯定会出问题,删掉即可。

解决方案四:

不是这样的一定要给结构体当中的元素分配空间
#include
#include
struct A{
int num[3];
};
int main()
{
int i,j;
struct A *a = (struct A *)calloc(3,sizeof(struct A));
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
a[i].num[j] = (int *)calloc(1,sizeof(int));
}
for(i=0;i<3;i++)
free(a[i].num[j]); //编译器编译显示这里出错
free(a);
return 0;
}
如果这样打印出来就会乱码

解决方案五:

“a[i].num[j]”定义的是int型,当然报错。强制转换int*试试,或者定义的时候就定义成int*。

解决方案六:

把两个for 揉一起吧

解决方案七:

#include "stdafx.h"
#include "stdlib.h"

struct A{
    int num[3];
};

int _tmain(int argc, _TCHAR* argv[])
{
    int i,j;
    struct A *a = (struct A *)calloc(3,sizeof(struct A));
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            int * ptr = (int *)calloc(1,sizeof(int));
            printf("%dn",(int)ptr);
            printf("%dn",*ptr);

            a[i].num[j] = (int)ptr;
        }
    }

    printf("n-------------n");

    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%dn",a[i].num[j]);
            printf("%dn",*(int*)a[i].num[j]);

            free((int*)a[i].num[j]); //编译器编译显示这里出错
        }
    }
    free(a);
    return 0;
}

IDE:VC2008

解决方案八:

怎么不用指针数组呢,更方便些。

时间: 2024-12-21 04:19:23

struct-如何解决C语言给结构体当中的数组分配堆空间的问题的相关文章

struct-C语言中结构体中的数组,不能直接赋值吗

问题描述 C语言中结构体中的数组,不能直接赋值吗 设有定义:struct{char mark[12];intnum1;double num2;}t1,t2;若变量均已正确赋初值,则以下语句中错误的是(C) (A) t1=t2; (B) t2.num1=t1.num1; (C) t2.mark=t1.mark;//mark为结构体中的数组,不能直接赋值?? (D) t2.num2=t1.num2; ?====如题参考答案说为结构体中的数组,不能直接赋值,为什么呢?那应该怎么赋值呢?求大侠指教 解决

C语言中结构体(struct)的几种初始化方法_C 语言

本文给大家总结的struct数据有3种初始化方法      1.顺序      2.C风格的乱序      3.C++风格的乱序 下面通过示例代码详细介绍这三种初始化方法. 1)顺序 这种方法很常见,在一般的介绍C的书中都有介绍.顺序初始化的特点是: 按照成员定义的顺序,从前到后逐个初始化:允许只初始化部分成员:在被初始化的成员之前,不能有未初始化的成员. 示例: struct User oneUser = {10, "Lucy", "/home/Lucy"}; 2

解析C语言中结构体struct的对齐问题_C 语言

首先看一下结构体对齐的三个概念值: 数据类型的默认对齐值(自身对齐): 1.基本数据类型:为指定平台上基本类型的长度.如在32位机器中,char对齐值为1,short为2,int,float为4,double为8: 结构体:其数据成员中默认对齐值最大的那个值. 2.指定对齐值:#pragma pack (value)时的指定对齐值value. 3.数据类型的有效对齐值:默认对齐值和指定对齐值中小的那个值. 有了这些值,我们就可以很方便的来讨论具体数据结构的成员和其自身的对齐方式.有效对齐值N是最

C语言中结构体struct编写的一些要点解析_C 语言

一.关于结构体的声明1.匿名声明.如: struct { int i,j; }point; 说明: 这段代码的含义是,声明一个无名(anonymous)的结构体,并创建了一个结构体变量point.如果这段声明是放在全局域(在任意函数(比如main函数)外)内,那么point内的变量将被初始化为默认值,换句话说,以这种方式声明结构体变量时就已经为它分配了内存空间. 适用于该结构体只需要产生一个变量!本例中,该匿名结构体将有且仅有point这个结构体变量! 不同的匿名结构体变量,类型是不同的!如 s

c语言-一道C语言用结构体排序的题目 大神快来帮我理解下人家的代码~~~

问题描述 一道C语言用结构体排序的题目 大神快来帮我理解下人家的代码~~~ 描述 小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管.这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下: 1. 这根钢管一定要是仓库中最长的: 2. 这根钢管一定要是最长的钢管中最细的: 3. 这根钢管一定要是符合前两条的钢管中编码最大的(每根钢管都有一个互不相同的编码,越大表示生产日期越近). 相关的资料到是有,可是,手工从几百份钢管材料中选出符合要求的那根-- 要不,还是请你编

详解C语言的结构体中成员变量偏移问题_C 语言

c语言中关于结构体的位置偏移原则简单,但经常忘记,做点笔记以是个记忆的好办法 原则有三个: a.结构体中的所有成员其首地址偏移量必须为器数据类型长度的整数被,其中第一个成员的首地址偏移量为0, 例如,若第二个成员类型为int,则其首地址偏移量必须为4的倍数,否则就要"首部填充":以此类推 b.结构体所占的总字节数即sizeof()函数返回的值必须是最大成员的长度的整数倍,否则要进行"末尾填充": c.若结构体A将结构体B作为其成员,则结构体B存储的首地址的偏移量必须

C语言中结构体偏移及结构体成员变量访问方式的问题讨论_C 语言

c语言结构体偏移 示例1 我们先来定义一下需求: 已知结构体类型定义如下: struct node_t{ char a; int b; int c; }; 且结构体1Byte对齐 #pragma pack(1) 求: 结构体struct node_t中成员变量c的偏移. 注:这里的偏移量指的是相对于结构体起始位置的偏移量. 看到这个问题的时候,我相信不同的人脑中浮现的解决方法可能会有所差异,下面我们分析以下几种可能的解法: 方法1 如果你对c语言的库函数比较熟悉的话,那么你第一个想到的肯定是of

【Go语言】【13】再谈GO语言的结构体

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qingkechina.blog.51cto.com/5552198/1671842 本文从如下四个方面再领着大家认识结构体 匿名结构体和匿名成员的结构体 值传递和引用传递 再谈嵌套结构体 面向对象 1.匿名结构体和匿名成员的结构体 如上篇所述,一个结构体需要先声明,再初始化,最后把初始化后的结构体赋值给其它变量,例如: /*声明结构体*/ type employee struc

c语言结构体中指针数组怎样赋值

问题描述 c语言结构体中指针数组怎样赋值 定义一个结构体struct AS{ char *p[1]:}:怎样用gets函数给指针数组赋值呢? 解决方案 看Unix/Linux上的man: Standard C Library Functions gets(3C)NAME gets fgets - get a string from a stream SYNOPSIS #include char *gets(char *s); char *fgets(char *s int n FILE *str