首先说我一直在寻找网络上的信息,用gdb调试进行测试......没什么......我仍然不明白错误,我明白它可能来自“ getline“指令,但我不确定......
代码的主要思想是逐行读取并将字符串转换为浮点数并将浮点数保存在名为nfloat
的数组中,然后调用函数:* create_table *以创建指针数组类型向量。
输入为.txt
,其中包含: n =字符串数,在本例中 n = 3
3
[9.3,1.2,87.9]
[1.0,1.0]
[0.0,0.0,1.0]
第一个数字3
是我们在图片中可以看到的向量数,但该数字不是静态的,输入可以是5
或7
等而不是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]信息创建函数。
当我打印出循环时,有人可以帮我理解问题出在哪里吗?
答案 0 :(得分:3)
vector *pointvector;
pointvector = &newvect;
return(pointvector);
您正在返回指向本地变量的指针。这是不正确的,需要通过为newvect
分配动态内存或在函数内使用static
变量然后复制数据(数据在两次调用之间不会持续存在)来更改。
编辑:根据要求,动态分配示例:
vector *create_vector(int n, float* comps){
vector *newvect = malloc(sizeof(*newvect));
newvect->data = malloc(n*sizeof(float));
memcpy(newvect->data, comps, sizeof(float) * n);
newvect->size = n;
return newvector;
}
当然,在某些时候你需要释放数据和矢量本身。
答案 1 :(得分:0)
在这一行
printf("%f\n", v[i]->data[1]); //segmentation fault:11 :(!! }
i
等于n
。并且当v
被声明为v[n]
时,上面的行通过访问v
越界来激发未定义的行为。
要解决将地址返回到局部变量的问题,请执行以下操作:
vector * create_vector(size_t n, float * comps)
{
vector * newvect = malloc(sizeof(*newvect);
if (NULL != newvect)
{
return NULL;
}
newvect->data = malloc(n * sizeof(*newvect->data));
if (NULL != newvect->data)
{
free(newvect);
return NULL;
}
for(size_t i = 0; i < n; i++)
{
newvect->data[i] = comps[i];
printf("newvect->data[%zu] = %.1f\n", i, newvect->data[i]);
}
newvect->size = n;
return newvect;
}