【问题标题】:SIGSEV on strcpy to a char pointer [duplicate]strcpy上的SIGSEGV到char指针[重复]
【发布时间】:2019-06-29 04:40:17
【问题描述】:

为什么我会在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 $1}'";
        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,'\0'); -- even with appending a null character at the end it doesnt work
                        strcpy(str[strCount],line);
                        //strip(str[strCount]);
                        (strCount)++;
                }
        }
        return 0;
}

【问题讨论】:

  • @anurag86 str[strCount] 指向的指针是什么?嗯....告诉你它不需要malloc 的“某人”可能是说“你不需要malloc 来管理这里的内存”。只需使用数组数组;不是指针数组。
  • @anurag86 在使用strcpy 将字符串复制到该指针之前,您绝对需要为指针分配内存。在另一个问题中,我们试图告诉您的是,malloc() 不是执行此类分配的唯一方法。还有其他方法。
  • True 声明:指针必须指向有效内存才能使用它,例如,在您可以使用strcpy 将字符串“复制”到其中之前。错误陈述:必须使用malloc初始化指针才能使用。
  • 真实声明:使用前不需要调用malloc来初始化指针;还有其他方法。错误陈述:使用前不需要调用malloc来初始化指针;你可以继续使用它而不初始化。
  • @anurag86 请阅读the other question 的所有答案——我不确定你是否从中得到了所有答案。另外,您是否阅读了生成的chat session

标签: c strcpy


【解决方案1】:

问题出在这句话strcpy(str[strCount],line)

char *str[100]; 声明了一个包含 100 个未初始化指针的数组,其中每个指针都需要显式分配内存。

当您运行str[strCount]=malloc(MAX_LINE_SIZE); 语句时,您实际上是在为单个指针分配内存,strcpy 进一步使用这些指针来复制字符串。

当您不使用 malloc 时,它是一个未初始化的指针(没有分配的内存)导致 strcpy 失败,因为您正在处理可能不属于您或可能根本不存在的内存。

【讨论】:

  • 更简洁的说法是 char *str[100]; 声明和指向 char 的 100 个 未初始化 指针数组。 (但我们知道你的意思)
  • 好(希望错别字比我少……)但这清楚地表明问题是初始化问题之一。 (并且需要通过分配起始地址并将起始地址分配给每个指针的有效内存块来进行初始化)
  • 我问这个是因为在stackoverflow.com/questions/56810234/… 有人说当被问到“char * [] 需要 malloc()”时不需要 mlloc,我被告知不需要它。因此这个问题
  • @anurag86 有人在谈论另一种语言。他们所说的都不适用于 C。无论如何,你不能只拿一个复杂故事中的第一句话就跑掉。
  • @anurag86,如果您指的是答案的第二点,如果不使用 malloc,则您错过了这一点,它需要直接指向字符串文字(仅在 C 中;在 C++ 中,您需要指向 const 的指针)。或者它可以指向堆栈上的内存。
猜你喜欢
  • 1970-01-01
  • 2021-08-11
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
相关资源
最近更新 更多