这个C程序安全吗?

问题描述

我担心此程序中的内存泄漏。具体来说,check_if_pal过程使str指针递增以隐藏第一个字符。这会干扰自动内存分配吗?使用堆会更安全吗?返回之前我需要恢复str吗?

这是代码

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

int check_if_pal(char *);

int main(int argc,char *argv[]) {

        char *not;

        for (int i = 1; i < argc; i++) {
                if (check_if_pal(argv[i])) {
                        not = " not";
                } else {
                        not = "";
                }

                printf("%s is%s a palindrome.\n",argv[i],not);
        }

        return 0;
}

int check_if_pal(char *str) {

        while (strlen(str) > 1) {
                if (str[0] != str[strlen(str) - 1]) {
                        return 0;
                }

                str[strlen(str) - 1] = '\0';
                str++;
        }

        return 1;
};

解决方法

此C程序安全吗?

由于您如何操纵str指针,因此很难分析。根据代码的编写方式,证明程序是内存安全的可能非常容易,也可能非常困难。

例如,尝试仅调用一次strlen并保持str不变。这样一来,您将发现证明索引保持在范围内要容易得多。

我担心该程序中的内存泄漏。

因为没有分配,所以没有内存泄漏。

具体来说,check_if_pal过程增加了str指针以隐藏第一个字符。这会干扰自动内存分配吗?

不,不会。

使用堆会更安全吗?

这取决于环境,操作系统,编译器,使用的标志...

但是,通常来说,堆可以使错误更容易发现(尤其是在调试时),因为分配更加明确。

返回之前是否需要还原str?

不,指针是一个副本,因此您可以使用它进行任何操作。

,

这里没有分配任何东西,所以不会有任何内存泄漏。

即使您有分配,也要记住一个指针本身并不代表分配,它指向已分配的内存 ,并且对于最终free()来说是必要的。如果丢失了指针的跟踪,则更改指针不会使分配无效。

您可以随意更改str之类的指针,这些指针可以根据需要任意更改,因为这只会影响该函数的局部作用域。