从函数返回“字符指针”时是否有任何问题

时间:2019-08-06 11:22:03

标签: c memory-management memory-leaks scope c-strings

下面的代码应返回一个仅包含用户输入的字符串中的数字的字符串。

另外,返回的字符串应将数字分为三个数字,并在数字之间加上'-'。

一切正常,代码编译没有任何错误,但是char*并未从函数中返回。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* phoneNo(char*); 

void main(){

    char str[100];
    char *strpass = str;

    printf("Enter the string: ");
    fgets(str,100,stdin);

    printf("Entered stringis: %s\n",str);

    char *result = phoneNo(strpass);
    printf("Returned char* is: %s\n",result);
}

char* phoneNo(char *strpass){

    char str[100];
    strcpy(str,strpass);
    printf("Char[] in Function: %s",str);

    char answer[100];
    char * result;
    result = ( char* ) malloc(100*sizeof(char));
    result=answer;
    //printf("Char* pointed to Char[]: %s\n",result);

    int i=0;
    int j=0;
    int k=3;

    while(str[i]!='\0'){

        if(str[i]=='1'||str[i]=='2'||str[i]=='3'||str[i]=='4'||str[i]=='5'||str[i]=='6'||str[i]=='7'||str[i]=='8'||str[i]=='9'||str[i]=='0')
        {


            if(j==0){

                answer[j]=str[i];
                answer[j+1]='\0';
                j++;
                i++;
                continue;
            }

            if(j==k){
                answer[j]='-';
                answer[j+1]='\0';
                j++;
                k+=4;
            }else{
                answer[j]=str[i];
                answer[j+1]='\0';
                j++;
                i++;
            }
        }
        else
            i++;
    }
    printf("Char* to be returned: %s\n",result);

    return (char *)result;
}

2 个答案:

答案 0 :(得分:1)

此代码段

char answer[100];
char * result;
result = ( char* ) malloc(100*sizeof(char));
result=answer;

存在内存泄漏,因为已分配的内存地址由于该语句而丢失

result=answer;

现在指针result指向本地数组answer,并从函数返回,导致未定义行为,因为退出该函数后该数组将不活动。

使用分配的动态数组进行处理,而不要使用本地数组answer

请注意,而不要使用此复合if语句

if(str[i]=='1'||str[i]=='2'||str[i]=='3'||str[i]=='4'||str[i]=='5'||str[i]=='6'||str[i]=='7'||str[i]=='8'||str[i]=='9'||str[i]=='0')

写要好得多

if ( isdigit( ( unsigned char )str[i] ) )

函数应声明为

char* phoneNo(const char *strpass);

这是它的参数必须具有限定符const

我将按照演示程序中所示的方式编写函数。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

char * phoneNo( const char *s )
{
    const size_t GROUP_SIZE = 3;

    size_t digits_count = 0;

    for ( const char *p = s; *p; ++p )
    {
        if ( isdigit( ( unsigned char )*p ) ) ++digits_count;
    }

    char *result = malloc( digits_count + digits_count / GROUP_SIZE + sizeof( ( char )'\0' ) );

    size_t i = 0;

    for ( size_t k = 0; *s; ++s )
    {
        if ( isdigit( ( unsigned char )*s ) )
        {
            if ( k == GROUP_SIZE )
            {
                if ( i != 0 )
                {
                    result[i++] = '-';
                }
                k = 0;
            }

            result[i++] = *s;
            ++k;
        }
    }

    result[i] = '\0';

    return result;
}

int main(void) 
{
    const char *s = "123456789";

    char *result = phoneNo( s );

    puts( result );

    free( result );

    s = "12\t34567\t89";

    result = phoneNo( s );

    puts( result );

    free( result );

    return 0;
}

程序输出为

123-456-789
123-456-789

答案 1 :(得分:0)

首先为result分配内存,然后在下一行result=answer;中立即将其指向其他位置,从而导致内存泄漏,而不是指向局部变量。这是错误。