我定义了两个typedef struct
,第二个将第一个作为对象:
typedef struct
{
int numFeatures;
float* levelNums;
} Symbol;
typedef struct
{
int numSymbols;
Symbol* symbols;
} Data_Set;
然后我定义了numFeatures
和numSymbols
并为symbols
和levelNums
分配内存,然后在for循环内填充levelNums
,内部值为循环索引只是为了验证它是否按预期工作。
Data_Set lung_cancer;
lung_cancer.numSymbols = 5;
lung_cancer.symbols = (Symbol*)malloc( lung_cancer.numSymbols * sizeof( Symbol ) );
lung_cancer.symbols->numFeatures = 3;
lung_cancer.symbols->levelNums = (float*)malloc( lung_cancer.symbols->numFeatures * sizeof( float ) );
for(int symbol = 0; symbol < lung_cancer.numSymbols; symbol++ )
for( int feature = 0; feature < lung_cancer.symbols->numFeatures; feature++ )
*(lung_cancer.symbols->levelNums + symbol * lung_cancer.symbols->numFeatures + feature ) = feature;
for(int symbol = 0; symbol < lung_cancer.numSymbols; symbol++ )
for( int feature = 0; feature < lung_cancer.symbols->numFeatures; feature++ )
cout << *(lung_cancer.symbols->levelNums + symbol * lung_cancer.symbols->numFeatures + feature ) << endl;
return 0;
当levelNums
为int
时,我得到了我期望的结果(即0,1,2,0,1,2,...),但当它们是float
时,只有symbols
前3个是正确的,剩下的是非常小或非常大的值,而不是预期的0,1,2。然后我有两个问题:
Symbol
分配内存时,它是如何知道levelNums
有多大,因为我还没有定义float
的大小。levelNums
值转换为typedef struct
。我这样做的原因是这是一个数据结构,将被发送到GPU以便在CUDA中进行GPGPU编程,并且无法识别数组。我只能明确地发送一个连续的内存块,{{1}}仅用于传达/定义数据的内存结构。
答案 0 :(得分:0)
有几件事情在见面时跳了出来。首先,您只为第一个符号的levelNums分配了一个缓冲区。同样,你的内部循环总是遍历第一个符号的numFeatures。
您正在进行大量的数组解引用,这一般情况下很好,但特别是(在第一组循环内)赋值看起来很奇怪。完全有可能我只是不明白你在那里尝试做什么,但我认为如果你使用一些方括号数组访问器,那就不那么容易混淆了。