strlen 和空闲内存
strlen and free memory
我将内存分配给一个指针,该指针指向它可以拥有的最大字符大小。
然后我不得不编写代码,根据从文件中读取的值更改其值,我需要知道指针中值的长度,所以我使用了 strlen()
函数。
我得到了我需要的东西。
当我试图释放该指针的内存时出现问题。程序崩溃了,我假设我正在做某事 "ilegal" 并且想知道为什么以及如何修复它。
部分代码如下:
char *StudID = (char*)malloc(sizeof(char)*15);
char *StudIDcpy = (char*)malloc(sizeof(char) * 15);
fread(stud[i].ID, sizeof(char), 4, in);
stud[i].ID[4] = '[=10=]';
IDtemp = atoi(stud[i].ID);//convert ID string to integer and store value in IDtemp
StudIDcpy = itoba(IDtemp);//convert integer to binary number as a string
strcpy(StudID, StudIDcpy);
IDtemp = strlen(StudIDcpy);
free(StudIDcpy); // <---- I BELIEVE THIS IS WHERE IT CRASHES
这是我的 itoba()
函数:
char *itoba(int a){
int i = 0, j;
char temp[15];
while(a){
if (a % 2)temp[i] = '1';
else temp[i] = '0';
i++;
a = a / 2;
}
temp[i] = '[=11=]';
for (j = 0; j < i / 2; j++)swapc(&temp[j], &temp[i - j-1]);
return temp;
}
顺便说一下,我知道我不必写 sizeof(char)
,因为它等于 1,但我还是写了它,所以我记得应该在那里放什么值。
在您的 itoba()
函数中,temp
返回一个局部数组,该数组衰减为指向局部变量的指针。
在一个函数returns之后,它的局部变量立即被"free"编辑,允许这些内存space被其他人重用。因此,它们持有的值很快就会被堆栈上的其他值覆盖。
你可以这样重写itoba()
:
char *itoba(int a)
{
int i = 0, j;
char *temp = malloc(15); // <--- This line is different
while(a){
if (a % 2)
temp[i] = '1';
else
temp[i] = '0';
i++;
a = a / 2;
}
temp[i] = '[=10=]';
for (j = 0; j < i / 2; j++)
swapc(&temp[j], &temp[i - j -1]);
return temp;
}
顺便说一句:您应该删除 char *StudIDcpy = (char*)malloc(sizeof(char) * 15);
,因为 malloc()
返回的指针值后来被 itoba(IDtemp);
丢弃。结果,这个malloc()
分配给StudIDcpy
的内存永远不会被释放,造成内存泄漏。
我将内存分配给一个指针,该指针指向它可以拥有的最大字符大小。
然后我不得不编写代码,根据从文件中读取的值更改其值,我需要知道指针中值的长度,所以我使用了 strlen()
函数。
我得到了我需要的东西。 当我试图释放该指针的内存时出现问题。程序崩溃了,我假设我正在做某事 "ilegal" 并且想知道为什么以及如何修复它。
部分代码如下:
char *StudID = (char*)malloc(sizeof(char)*15);
char *StudIDcpy = (char*)malloc(sizeof(char) * 15);
fread(stud[i].ID, sizeof(char), 4, in);
stud[i].ID[4] = '[=10=]';
IDtemp = atoi(stud[i].ID);//convert ID string to integer and store value in IDtemp
StudIDcpy = itoba(IDtemp);//convert integer to binary number as a string
strcpy(StudID, StudIDcpy);
IDtemp = strlen(StudIDcpy);
free(StudIDcpy); // <---- I BELIEVE THIS IS WHERE IT CRASHES
这是我的 itoba()
函数:
char *itoba(int a){
int i = 0, j;
char temp[15];
while(a){
if (a % 2)temp[i] = '1';
else temp[i] = '0';
i++;
a = a / 2;
}
temp[i] = '[=11=]';
for (j = 0; j < i / 2; j++)swapc(&temp[j], &temp[i - j-1]);
return temp;
}
顺便说一下,我知道我不必写 sizeof(char)
,因为它等于 1,但我还是写了它,所以我记得应该在那里放什么值。
在您的 itoba()
函数中,temp
返回一个局部数组,该数组衰减为指向局部变量的指针。
在一个函数returns之后,它的局部变量立即被"free"编辑,允许这些内存space被其他人重用。因此,它们持有的值很快就会被堆栈上的其他值覆盖。
你可以这样重写itoba()
:
char *itoba(int a)
{
int i = 0, j;
char *temp = malloc(15); // <--- This line is different
while(a){
if (a % 2)
temp[i] = '1';
else
temp[i] = '0';
i++;
a = a / 2;
}
temp[i] = '[=10=]';
for (j = 0; j < i / 2; j++)
swapc(&temp[j], &temp[i - j -1]);
return temp;
}
顺便说一句:您应该删除 char *StudIDcpy = (char*)malloc(sizeof(char) * 15);
,因为 malloc()
返回的指针值后来被 itoba(IDtemp);
丢弃。结果,这个malloc()
分配给StudIDcpy
的内存永远不会被释放,造成内存泄漏。