函数内的局部字符指针

问题描述 投票:0回答:1

我正在尝试编写一个函数来过滤 C 中字符串中的非字母字符。

因此,在函数“wordFilter”中,我初始化了一个 char 数组,以便存储过滤后的字符串,然后将其分配给指针,以便我可以返回它。

然而,事实证明,每当该函数在第一次执行后,字符数组“引用”似乎仍然保留上次执行完成时的值。有没有办法让“引用”数组每次在函数执行开始时都为空。

这是我的代码:

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

char *wordFilter(char *string){
    char reference[strlen(string)];
    int index = 0;
    while(*string){
        if (isalpha(*string)){
            reference[index] = *string;
            index++;
        }
        string++;
    }
    char *ptr = malloc(sizeof(char)*index);
    ptr = reference;
    return ptr;
    
}

int main(){
    char input[256];
    char *ptr = input;
    char input2[256];
    fgets(input, 256, stdin);
    
    char reference[256];
    for (int pos = 0; sscanf(ptr, "%s%n", input2, &pos) == 1; ptr+=pos){
        printf("%s ", wordFilter(input2));
    }
    return 0;
} 
c pointers memory malloc free
1个回答
0
投票

主要问题是这一行:

ptr = reference;
这不会将
reference
的字符复制到
ptr
中。正如 Eugene 指出的,该行导致变量
ptr
指向堆栈分配的
reference
数组,泄漏您
malloc
ed 的内存。

以下是我建议的更改:

  1. reference
    一样分配
    char reference[strlen(string) + 1];
    ,为终止空值留出空间。
  2. while
    循环之后,以空终止
    reference
    ,如下所示:
    reference[index] = '\0';
  3. 不要使用
    malloc
    并复制字符串,而是使用
    strdup(reference)
    来堆分配
    reference
    的副本,然后您可以返回从
    strdup
    中获得的内容。
© www.soinside.com 2019 - 2024. All rights reserved.