首页 > 解决方案 > struct 中指针的 malloc() 不会将内存绑定到声明的大小

问题描述

我想将*float vec_value(成员struct vec)绑定到定义的大小。我使用 malloc():

     pattern_ptr->vec_value=malloc(dataset.mFeatures * sizeof(float))

为了确保分配正确完成,如果 VALUE>=dataset.mFeatures 在以下情况下,我希望看到 SegFault:

     printf("%f\n",pattern_ptr[N].vec_value[VALUE]);

但它编译并打印内存中相邻区域的值。

这是代码:

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

struct vec{
    int id_vec;
    float *vec_value;
};

//prototipi
Dataset loadDataset(void); // struct { int nPattern; int mFeatures; float *dataset_ptr;  }

int main(){

    int i,j;
    Dataset dataset=loadDataset();
    struct vec *pattern_ptr=malloc(dataset.nPattern * sizeof(struct vec));
    pattern_ptr->vec_value=malloc(dataset.mFeatures * sizeof(float));
    for(i=0;i<dataset.nPattern;i++){
        pattern_ptr[i].id_vec=i;
        pattern_ptr[i].vec_value=&dataset.dataset_ptr[i*dataset.mFeatures];
    }

    printf("%f\n",pattern_ptr[1].vec_value[10]);

怎么了?

标签: cpointersstructmalloc

解决方案


C 语言标准不要求对数组访问进行边界检查(个别实现可能会添加边界检查,但我不知道有任何这样做)。如果您在数组(或malloc'ed 缓冲区)之外进行索引,它也没有指定行为应该是什么。编译器和运行时环境都不需要以任何特定方式处理这种情况(行为未定义)。

由程序员决定不要在数组末尾读取或写入。


推荐阅读