将 strcpy 上的 SIGSEGV 发送到 char 指针
SIGSEV on strcpy to a char pointer
为什么我什至会在 strcpy
上崩溃。我尝试使用 sprintf 附加 0,\0,\n 并在 gdb 中检查它是否正确附加,但我仍然遇到崩溃。
使用 malloc 我不会崩溃,但有人告诉我在这种情况下不需要 malloc。
include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LINE_SIZE 10
int main()
{
char* str[100];
int strCount=0;
char cCmd[] = "<some command>|awk '{print }'";
FILE *fp;
fp = popen(cCmd,"r");
if(cCmd != NULL)
{
char line[MAX_LINE_SIZE];
while (fgets(line, sizeof(line), fp) != NULL )
{
//str[strCount]=malloc(MAX_LINE_SIZE);
//sprintf(line,"%s%c",line,'[=10=]'); -- even with appending a null character at the end it doesnt work
strcpy(str[strCount],line);
//strip(str[strCount]);
(strCount)++;
}
}
return 0;
}
问题出在这条语句strcpy(str[strCount],line)
char *str[100];
声明了一个包含 100 个未初始化指针的数组,每个指针都需要显式分配内存。
当您 运行 str[strCount]=malloc(MAX_LINE_SIZE);
语句时,您实际上是在为单个指针分配内存,strcpy 进一步使用这些指针来复制字符串。
当您不使用 malloc 时,它是一个未初始化的指针(没有分配的内存)导致 strcpy 失败,因为您正在处理可能不属于您或根本不存在的内存。
为什么我什至会在 strcpy
上崩溃。我尝试使用 sprintf 附加 0,\0,\n 并在 gdb 中检查它是否正确附加,但我仍然遇到崩溃。
使用 malloc 我不会崩溃,但有人告诉我在这种情况下不需要 malloc。
include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LINE_SIZE 10
int main()
{
char* str[100];
int strCount=0;
char cCmd[] = "<some command>|awk '{print }'";
FILE *fp;
fp = popen(cCmd,"r");
if(cCmd != NULL)
{
char line[MAX_LINE_SIZE];
while (fgets(line, sizeof(line), fp) != NULL )
{
//str[strCount]=malloc(MAX_LINE_SIZE);
//sprintf(line,"%s%c",line,'[=10=]'); -- even with appending a null character at the end it doesnt work
strcpy(str[strCount],line);
//strip(str[strCount]);
(strCount)++;
}
}
return 0;
}
问题出在这条语句strcpy(str[strCount],line)
char *str[100];
声明了一个包含 100 个未初始化指针的数组,每个指针都需要显式分配内存。
当您 运行 str[strCount]=malloc(MAX_LINE_SIZE);
语句时,您实际上是在为单个指针分配内存,strcpy 进一步使用这些指针来复制字符串。
当您不使用 malloc 时,它是一个未初始化的指针(没有分配的内存)导致 strcpy 失败,因为您正在处理可能不属于您或根本不存在的内存。