【问题标题】:Dynamic Memory Allocation with pointer arrays使用指针数组进行动态内存分配
【发布时间】:2013-08-13 21:41:32
【问题描述】:

我正在尝试从网络上的教程中学习 C,我想出了这个简单的代码来尝试了解指针和数组的内存分配。

如果size size > 2,则会出现分段错误。有人可以说明如何正确执行此操作吗?

谢谢。


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


int main () {


int i, size;

printf("Quantos registos pretende inserir? ");
scanf("%d",&size);
getc(stdin);

typedef struct {
    char nome[81];
    int idade;
    char cargo[81];
} Dados;

Dados *data[(size-1)];

data[(size-1)] = (Dados *)malloc(sizeof(Dados));


for(i=0;i<size;i++) {
    printf("\nInsira os dados do funcionário: ");
    printf("\n\n\tNome: ");
    gets(data[i]->nome);
    printf("\n\tIdade: ");
    scanf("%d",&data[i]->idade);
    getc(stdin);
    printf("\n\tCargo: ");
    gets(data[i]->cargo);

    FILE *fdados;
    if(!(fdados = fopen("dados.txt","a+"))) {
         printf("Impossivel aceder ao ficheiro, verfique o erro ocorrido ...");
    }

    fprintf(fdados, "Funcionário %d:",(i+1));
    fprintf(fdados, "\n\n\tNome: %s",data[i]->nome);
    fprintf(fdados, "\n\tIdade: %d",data[i]->idade);
    fprintf(fdados, "\n\tCargo: %s\n\n",data[i]->cargo);

    fclose(fdados);

}

free(data[(size-1)]);

fflush(stdin);
return(0);
}

【问题讨论】:

  • 请不要使用“完美无瑕”这个词。唯一的意思是你不知道你在做什么。您的代码并非完美无缺,但对于 any 值为size, since data[size - 1]` 的可怕车祸总是 越界错误,因为数组总是短一个元素。
  • (这甚至没有考虑到可变长度数组必须具有严格的正大小,并且 size 是有符号的并且很可能是负数,并且您没有为大部分数组元素。)
  • 你说得对,选词不当。感谢您的宝贵时间!

标签: c arrays pointers malloc


【解决方案1】:

你一次性给自己做太多事情了。分解问题并测试每个组件:

  1. 解析用户输入:生成有效的size_t 整数或中止。检查该值既不是零也不是太大,或者中止。

  2. 假设您已经解析了值n。为结构的n 副本分配内存:

    Dados * data = malloc(n * sizeof(Dados));
    

    最后,释放内存:

    free(data);
    
  3. 使用正确的解析和错误处理来填充每个数组成员data[i]

  4. 单独练习文件操作。

【讨论】:

  • 非常感谢,如果您无法找到一个友好的答案来为您指明正确的方向,那么尝试从网络中学习有时会很困难。代码运行时没有分段问题
  • @tz0r:这并不意味着代码是正确的,它肯定是不健壮的。您应该始终对代码的每一部分(尤其是用户输入!)进行良好定义,并检查所有可能失败的返回值。
【解决方案2】:

你有一个结构,看起来你想在一个数组中创建该结构的多个副本。所以你要做的是这个

Dados *data;
data = (Dados *) malloc(sizeof(Dados) * size);

现在您在数据中拥有大小数量的 Dados 结构。

然后确保在最后释放你的记忆 免费(数据);

【讨论】:

    【解决方案3】:

    删除:getc(stdin);

    Dados *data[(size-1)];
    
    data[(size-1)] = (Dados *)malloc(sizeof(Dados));// here is wrong . 
                                                      you have data[size-1]
                                                 the max index you can use is size-2
    
    
    
    for(i=0;i<size;i++) // i < size-1 , since you use data[i] in loop ,
    
    free(data[(size-1)]); // free (data);  just free the pointer you get.
    

    【讨论】:

      猜你喜欢
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多