首先说我一直在寻找网络上的信息,用gdb调试进行测试......没有......我仍然不明白错误,我认为它可能来自“getline”指令,但我不确定...
代码的主要思想是逐行读取并将chars字符串转换为浮点数并将浮点数保存在一个数组中nfloat
,然后调用函数:*create_table*创建一个vector类型的指针数组。
输入是一个.txt
包含这个:n = 字符串的数量,在这种情况下n = 3
3
[9.3,1.2,87.9]
[1.0,1.0]
[0.0,0.0,1.0]
第一个数字3
是我们在图像中看到的向量的数量,但该数字不是静态的,输入可以是5
or7
等而不是3
.
到目前为止,我已经开始执行以下操作,但我认为代码存在一些内存错误:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
float* data;
int size;
} vector;
vector *create_vector(int n, float* comps){
vector newvect;
newvect.data = (float *) malloc(n*sizeof(float));
int i;
for(i = 0; i < n; i++) {
newvect.data[i] = comps[i];
printf("Newvec.data[%d] = %.1f\n", i, newvect.data[i]);
}
newvect.size = n;
vector *pointvector;
pointvector = &newvect;
return(pointvector);
}
int NumsVector(char *linea, ssize_t size){
int numsvector = 1;
int n;
for(n = 2; n<= size; n++){
if (linea[n] != '[' && linea[n] != ']'){
if(linea[n] == 44){
numsvector = numsvector + 1;
}
}
}
return numsvector;
}
int main(){
int n, i;
scanf("%d\n", &n);
vector *v[n];
for(i = 0; i<n; ++i) {
char *line = NULL;
size_t len = 0;
ssize_t read;
read = getline(&line,&len,stdin);
int numsvector = NumsVector(line, read);
float nfloat[numsvector];
int j = 0;
/* Replaces the end ] with a , */
line[strlen(line) - 1] = ',';
/* creates a new pointer, pointing after the first [ in the original string */
char *p = line + 1;
do
{
/* grabs up to the next comma as a float */
sscanf(p, "%f,", &nfloat[j]);
/* moves pointer forward to next comma */
while (*(p++) != ',');
}
while (++j < numsvector); /* stops when you've got the expected number */
v[i] = create_vector(numsvector, nfloat);
printf("%f\n", v[i]->data[1]); //prints ok :)!
free(line);
}
printf("%f\n", v[i]->data[1]); //segmentation fault:11 :(!! }
好吧,问题来自我认为的 printf 指令,当我在循环内打印时,一切正常,但是当我尝试在 for 循环外执行相同操作时,它会打印分段错误错误......可能是一些内存泄漏?
了解 *v[n] 是否得到很好的实现并很好地存储信息对我来说很重要,以便继续根据 *v[n] 信息创建函数。
当我打印出循环时,请有人帮我理解问题出在哪里?