C程序中的段错误(核心转储)

Segmentation fault (core dumped) in C program

我有以下程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255

char * decrypt(char *p, int key){
    char *tmp;
    for(int i = 0; p[i] != '[=10=]'; i++){
        tmp[i] = p[i]-key;
    }
    return tmp;
}

int main(void){
    printf("Hallo Welt!");
    printf("%s\n", decrypt("ibmmp", 1));
    return EXIT_SUCCESS;
}

当我用 gcc -Wall 编译它时,我收到警告 tmp could get uninitialized in this function [-Wmaybe-uninitialized] tmp[i] = p[i]-key(翻译自德语)和分段错误(核心转储)./crypto 当我 运行 it

导致该错误的原因是什么?

我知道这个问题已经被问过很多次了,但我无法解决这个警告,因为其他人有不同的源代码,我无法根据我的问题进行调整。

在使用前为 tmp 分配内存。确保在返回之前以 null 终止字符串。

// Make the input a const string.
// char * decrypt(char *p, int key){
char * decrypt(char const* p, int key){
    char *tmp = malloc(strlen(p) + 1); // Allocate memory
    int i = 0;
    for( ; p[i] != '[=10=]'; i++){
        tmp[i] = p[i]-key;
    }
    tmp[i] = '[=10=]';                     // null terminate.
    return tmp;
}

确保释放内存。仅使用

printf("%s\n", decrypt("ibmmp", 1));

会导致内存泄漏。

int main(void){
    printf("Hallo Welt!");
    char* dec = decrypt("ibmmp", 1)
    printf("%s\n", dec);
    free(dec);                        // Deallocate memory.
    return EXIT_SUCCESS;
}

您需要分配 'tmp' 然后,保持良好的 'c' 编码,检查分配是否成功。我假设您已定义 MAX,因此您可以设置字符串长度的上限,因此我在下面使用它。如果 MAX 是字符数 为 null,那么您需要 'malloc(MAX +1)'。如果它打算包含 NULL,那么只需保留下面定义的代码即可。您还想决定在 malloc 失败时要 return 什么。我 return NULL,但您可能希望根据您的需要做一些不同的事情。

另请注意,此函数正在 returning 分配的内存,因此需要有人释放它,以免内存泄漏。

char * decrypt(char *p, int key){
    char *tmp;
    tmp = (char *) malloc(MAX);
    if(!tmp)
        return NULL;
    for(int i = 0; p[i] != '[=10=]'; i++){
        tmp[i] = p[i]-key;
    }
    return tmp;
}