我需要使用malloc将最终的char *传递给另一个函数。 Valgrind抱怨我没有初始化* temp,所以我使用了malloc。 我遇到的问题是没有分配内存? 我一直在努力解决这个问题,无法弄清楚如何修复它。
我是否在for循环期间丢失了内存分配?
然后再使用sprintf for newCatID?
任何建议都将不胜感激。
char *allocateCategoryID(ThisType *menu)
{
char catID[ID_LEN]="";
char *temp;
char *newCatID;
char *end;
int idNum=0;
int i=0;
int j = 0;
temp = malloc(ID_LEN-1);
newCatID = malloc(ID_LEN*sizeof(char));
/*get catID which strlen(catID)= ID_LEN*/
for(i=1; i<ID_LEN; i++)/*FIRST VALGRIND ERROR IS HERE*/
{
temp[j]= catID[i];
j++;
}
idNum = strtol(temp, &end, 10);/*NEXT VALGRIND ERROR IS HERE*/
idNum++;
sprintf(newCatID, "C%04i", idNum);/*NEXT VALGRIND ERROR IS HERE*/
printf("New Category ID: %s\n", newCatID);/*NEXT VALGRIND ERROR IS HERE*/
free(temp);
return newCatID;
}
Invalid write of size 1
0 bytes after a block of 4 alloc'd
Invalid read of size 1
0 bytes after a block of 5 alloc'd
Invalid write of size 1
0 bytes after a block of 5 alloc'd
Invalid read of size 1
0 bytes after a block of 5 alloc'd
答案 0 :(得分:1)
在此循环的最后一次迭代中:
for(i=1; i<ID_LEN; i++)/*FIRST VALGRIND ERROR IS HERE*/
{
temp[j]= catID[i];
j++;
}
你越界了,因为你在
中为LEN - 1
分配了空间
temp = malloc(ID_LEN-1);
更改为
temp = malloc(ID_LEN);
for(i = 1; i < ID_LEN; i++)
{
temp[j] = catID[i];
j++;
}
/* here you need to add the trailing '\0' */
temp[j] = '\0';