【问题标题】:Getting Segmentation fault for double pointer [closed]获取双指针的分段错误[关闭]
【发布时间】:2017-10-16 06:27:45
【问题描述】:
#include<stdio.h>
#include<stdlib.h>
#define MAX 256
int main()
{
    char **ptr;
    char input[MAX];
    int i=0,j=0,k=0;
    printf("Enter the string\n");
    scanf("%[^\n]",input);

    ptr=(char **)malloc(8+1);
    if(ptr==NULL)
    {
            printf("ptr malloc: error\n");
            return 0;
    }
    for(i=0;i<8;i++)
    {
            ptr[i]=(char*)malloc(MAX);
            if(ptr[i]==NULL)
            {
                    printf("malloc: Error\n");
                    return 0;
            }
    }
    for(i=0;i<8;i++) {
            k=0;
            if(i!=0)
                    j++;
            while(input[j]!=' ' && input[j]!='\0') {
            ptr[i][k++]=input[j];
            j++;
            }
            ptr[i][k]='\0';
    }
    for(i=0;i<8;i++)
            printf("%s\n",ptr[i]);
  return 0;
 }


GDB traces:
(gdb) p j
$17 = 12
(gdb) n
31                      ptr[i][k++]=input[j];
(gdb) p i
$18 = 4
(gdb) p k
$19 = 0
(gdb) p j
$20 = 12
(gdb) p input[j]
$21 = 119 'w'
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400625 in main () at kk.c:31
31                      ptr[i][k++]=input[j];

在这里,我提供的输入是 9 个单词,由一个空格分隔。直到 ptr[3] 在它崩溃之后它变得顺利。我希望双指针中的每个指针都指向一个单词,稍后我想计算同一个单词的频率。

输入 : w1 w2 w3 w1 w4 w2 w3 w1 w1 ,它在 i=4 时崩溃了

编辑: 我想要这样的输出 输出:新行中的每个单词。

【问题讨论】:

  • 您给malloc 的大小是您要分配的内存大小,以字节为单位。 8 个指针将占用比 9 个字节多得多的空间,尤其是在 64 位系统上(其中一个指针通常为 8 个字节)。
  • 您忘记包含#include &lt;stdlib.h&gt;,但还有其他问题
  • 哦,你错过了包含&lt;stdlib.h&gt; 使this question 非常相关。我建议您阅读它及其答案。
  • 这个程序应该做什么?给定输入的预期输出是多少?
  • 最后,与您的问题有些相关,但编译器不会给出一些警告吗?警告是你做错了什么的迹象,你应该修复的东西。例如,您有一个 return; 语句,没有返回值。这在声明为返回 int 的函数中无效(如 main 是)。

标签: c pointers segmentation-fault double-pointer


【解决方案1】:

您没有为ptr 正确分配内存。你需要改变:

ptr = (char **)malloc(8+1);

到:

ptr = malloc( (8+1) * sizeof(char*));

正如您的陈述暗示您要分配8+1 字节(而不是指针)。

还要记住not to cast the result of malloc

【讨论】:

  • Opps...错过了,谢谢
  • 还有其他问题。
  • 是的,我匆忙发布了问题,所以错过了。我将添加头文件并返回 0
  • @Saawaj 试试看,如果问题解决了,请告诉我。
  • @Marievi 根据您的建议解决了
【解决方案2】:

正如 Marievi 所指出的,您将错误的参数传递给第一个 malloc 调用。

每次想要分配内存时直接使用 malloc 是 C 程序员的一种流行做法。但是,它很容易出错,因为就像您所经历的那样,很容易弄错尺寸。在我的 C 项目中,我总是定义以下宏:

#define NEW_ARRAY(ptr, n) \
    (ptr) = malloc((n) * sizeof (ptr)[0]); \
    if ((ptr) == NULL) { \
        fprintf(stderr, "malloc: Error\n"); \
        exit(EXIT_FAILURE); \
    }

在单独的变量中跟踪动态数组的长度也是一个好主意。你的内存分配代码现在变成了

ptrLen = 8 + 1;
NEW_ARRAY(ptr, ptrLen);
for (i = 0; i < ptrLen; i++) {
    NEW_ARRAY(ptr[i], MAX);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多