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;
}
我有以下程序:
#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;
}