gpt4 book ai didi

c - 段错误 : 11 when printing out of a loop

转载 作者:太空宇宙 更新时间:2023-11-04 07:24:35 25 4
gpt4 key购买 nike

首先说一下,我一直在网络上找资料,用gdb调试做测试,什么都没有...我还是不明白这个错误,我的想法是它可能来自“getline”指令,但我不确定...

代码的主要思想是逐行读取并将chars字符串转换为 float 并将 float 保存在一个名为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 是我们在图像中看到的 vector 的数量,但该数字不是静态的,输入可以是 57 等而不是 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] 信息创建函数很重要。

当我打印出循环时,请有人帮助我了解问题出在哪里?

最佳答案

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;
}

当然,在某些时候您需要释放数据和 vector 本身。

关于c - 段错误 : 11 when printing out of a loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19358917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com