为什么释放动态分配的内存会在这里产生问题?
Why does freeing the dynamically allocated memory create issue here?
我有这个代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* creatString();
void printWordsThatStartWithLETTER(char letter, char *str);
void main()
{
char *strEx1;
char letter;
strEx1=creatString();
printf("Enter a letter:\n");
scanf("%c",&letter);
printWordsThatStartWithLETTER(letter, strEx1);
free(strEx1);
}
char* creatString()
{
char *str, *strTemp;
int size;
strTemp=(char*)malloc(256);
printf("enter your string:\n");
flushall();
gets(strTemp);
size = strlen(strTemp);
str=(char*)malloc(size);
strcpy(str,strTemp);
//puts(str);
free(strTemp);
return str;
}
void printWordsThatStartWithLETTER(char letter, char *str)
{
int sizeOfStrinf, i;
sizeOfStrinf = strlen(str);
for(i=0;i<sizeOfStrinf;i++)
{
if((str[i]==letter)||(str[i]==letter-32))
{
if(i==0)
{
while(str[i]!=32)
{
printf("%c",str[i]);
i++;
}
printf("\n");
}
else
if(str[i-1]==32)
{
while(str[i]!=32)
{
printf("%c",str[i]);
i++;
}
printf("\n");
}
}
}
}
它不会释放 strEx1
,我溢出了。如何正确释放 strEx1
?
您的代码中存在实际问题
size = strlen(strTemp);
str=(char*)malloc(size);
基本上,你少了一个元素,没有 space 空终止符。所以稍后使用 strcpy()
strcpy(str,strTemp);
导致调用 undefined behavior.
的越界访问
你应该这样做
str = malloc(size + 1);
也就是说,
- Please see this discussion on why not to cast the return value of
malloc()
and family in C
..
- 在使用 return 值之前,始终检查
malloc()
的 return 值是否成功,以避免空指针取消引用。
- You must not be using
gets()
.
您分配的内存太短了一个字节。加一个
size = strlen(strTemp);
str=(char*)malloc(size+1);
或
而不是 strcpy 使用 strncpy
size = strlen(strTemp);
str=(char*)malloc(size);
strncpy(str,strTemp,size);
strncpy函数将strSource的初始count个字符复制到strDest和returnsstrDest。如果 count 小于或等于 strSource 的长度,则不会自动将空字符附加到复制的字符串。如果 count 大于 strSource 的长度,则使用空字符填充目标字符串,直到达到长度 count。如果源字符串和目标字符串重叠,则 strncpy 的行为未定义
我有这个代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* creatString();
void printWordsThatStartWithLETTER(char letter, char *str);
void main()
{
char *strEx1;
char letter;
strEx1=creatString();
printf("Enter a letter:\n");
scanf("%c",&letter);
printWordsThatStartWithLETTER(letter, strEx1);
free(strEx1);
}
char* creatString()
{
char *str, *strTemp;
int size;
strTemp=(char*)malloc(256);
printf("enter your string:\n");
flushall();
gets(strTemp);
size = strlen(strTemp);
str=(char*)malloc(size);
strcpy(str,strTemp);
//puts(str);
free(strTemp);
return str;
}
void printWordsThatStartWithLETTER(char letter, char *str)
{
int sizeOfStrinf, i;
sizeOfStrinf = strlen(str);
for(i=0;i<sizeOfStrinf;i++)
{
if((str[i]==letter)||(str[i]==letter-32))
{
if(i==0)
{
while(str[i]!=32)
{
printf("%c",str[i]);
i++;
}
printf("\n");
}
else
if(str[i-1]==32)
{
while(str[i]!=32)
{
printf("%c",str[i]);
i++;
}
printf("\n");
}
}
}
}
它不会释放 strEx1
,我溢出了。如何正确释放 strEx1
?
您的代码中存在实际问题
size = strlen(strTemp);
str=(char*)malloc(size);
基本上,你少了一个元素,没有 space 空终止符。所以稍后使用 strcpy()
strcpy(str,strTemp);
导致调用 undefined behavior.
的越界访问你应该这样做
str = malloc(size + 1);
也就是说,
- Please see this discussion on why not to cast the return value of
malloc()
and family inC
.. - 在使用 return 值之前,始终检查
malloc()
的 return 值是否成功,以避免空指针取消引用。 - You must not be using
gets()
.
您分配的内存太短了一个字节。加一个
size = strlen(strTemp);
str=(char*)malloc(size+1);
或 而不是 strcpy 使用 strncpy
size = strlen(strTemp);
str=(char*)malloc(size);
strncpy(str,strTemp,size);
strncpy函数将strSource的初始count个字符复制到strDest和returnsstrDest。如果 count 小于或等于 strSource 的长度,则不会自动将空字符附加到复制的字符串。如果 count 大于 strSource 的长度,则使用空字符填充目标字符串,直到达到长度 count。如果源字符串和目标字符串重叠,则 strncpy 的行为未定义