我试图从文件中复制一些文本并将它们保存在struct成员中,我在cmd.exe上运行我的程序并且它崩溃了,但是当我在codeblocks或visual studio上运行它时,它可以工作,
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct AMIGOS
{
char nom[' '];
char apellido[' '];
char nompila[' '];
char tel[' '];
char correo[' '];
char dir[' '];
char fecha[' '];
};
int main()
{
struct AMIGOS reg;
char registro[128];
char**datos;
char*dato;
datos = (char**)malloc(10*sizeof(char**));
int tam;
int i=0;
FILE* pt = fopen("arch.txt","r");
if(pt==NULL)
{
printf("filenotfound\n");
}
else
{
while(fgets(registro,128,pt))
{
dato = strtok(registro,"|");
while(dato)
{
tam = strlen(dato);
datos[i] = (char *)malloc(tam);
memcpy(datos[i],dato,tam);
datos[i][tam]=0;
i++;
datos[i]=0;
dato = strtok(0,"|");
}
}
strcpy(reg.nom,datos[0]);
strcpy(reg.apellido,datos[1]);
strcpy(reg.nompila,datos[2]);
strcpy(reg.fecha,datos[3]);
strcpy(reg.tel,datos[4]);
strcpy(reg.correo,datos[5]);
strcpy(reg.dir,datos[6]);
printf("%s\n",reg.nom);
printf("%s\n",reg.apellido);
printf("%s\n",reg.nompila);
printf("%s\n",reg.fecha);
printf("%s\n",reg.tel);
printf("%s\n",reg.correo);
printf("%s\n",reg.dir);
}
}
文件上的文字:
kevin | clark | ns | march 15 2001 | 5555555 | l@mail.com | 123 street
当我尝试在cmd.exe上运行它时,有人知道为什么会崩溃吗?
答案 0 :(得分:2)
这是在数组末尾写的:
tam = strlen(dato);
datos[i] = (char *)malloc(tam);
memcpy(datos[i],dato,tam);
datos[i][tam]=0; <---- 'tam -1' is the last element
您需要添加一个额外的字符来存储空终止符,或者您可以使用strdup()
:
datos[i] = strdup(dato);
答案 1 :(得分:1)
我不知道为什么它在Visual Studio中有效但在Cmd Line中崩溃了。但是,您的代码中存在一些问题:
tam = strlen(dato);
datos[i] = (char *)malloc(tam); //You are not allocating memory for '\0' character
memcpy(datos[i],dato,tam);
datos[i][tam]=0; //So this is effectively an array out of bound write
应该是
tam = strlen(dato);
datos[i] = (char *)malloc(tam+1);
memcpy(datos[i],dato,tam);
datos[i][tam]=0;
答案 2 :(得分:1)
以下是一些问题:
datos = (char**)malloc(10*sizeof(char**));
你的意思是:
datos = (char**)malloc(10*sizeof(char*));
(遵循正常的C语言:
var = malloc(n * sizeof *var);
会避免这个错误。在实践中,尺寸可能相同,但原则上是错误的。另请注意,转换malloc
的结果在C中也是不受欢迎的。)
tam = strlen(dato);
datos[i] = (char *)malloc(tam);
memcpy(datos[i],dato,tam);
datos[i][tam]=0;
你的缓冲区溢出来了。您分配了tam
个字节的内存,然后将tam
个字节复制到其中,但之后您尝试NUL终止它。您需要分配tam + 1
个字节。
作为其他建议:
strcpy
的使用不安全;你无法保证标记化输入也不会导致你溢出这些缓冲区。fgets(registro,128,pt)
会更好fgets(registro, sizeof registro, pt)
。答案 3 :(得分:0)
此:
char nom[' '];
是非常奇怪的代码,它几乎肯定没有按照你的期望去做。我很想听听这段代码的动机。
它基本上将nom
声明为一个字符数组,其长度由字符 SPACE 的整数值给出。假设有一台ASCII机器,这相当于:
char nom[32];