【问题标题】:Why does freeing the dynamically allocated memory create issue here?为什么释放动态分配的内存会在这里产生问题?
【发布时间】:2016-05-20 07:22:33
【问题描述】:

我有这个代码:

#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

【问题讨论】:

标签: c string free


【解决方案1】:

您的代码中存在实际问题

size = strlen(strTemp);
str=(char*)malloc(size);

基本上,你是一个短元素,没有空终止符的空间。所以后来使用strcpy()

 strcpy(str,strTemp);

导致调用undefined behavior的越界访问。

你应该做类似的事情

 str = malloc(size + 1);

也就是说,

  1. Please see this discussion on why not to cast the return value of malloc() and family in C.
  2. 在使用返回值之前始终检查malloc() 的返回值是否成功,以避免空指针取消引用。
  3. You must not be using gets()

【讨论】:

    【解决方案2】:

    您分配的内存太短了一个字节。添加一个

    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 并返回 strDest。如果 count 小于或等于 strSource 的长度,则不会自动将空字符附加到复制的字符串。如果 count 大于 strSource 的长度,则用空字符填充目标字符串,直到长度为 count。如果源字符串和目标字符串重叠,则 strncpy 的行为未定义

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      相关资源
      最近更新 更多