双指针

时间:2017-10-16 06:27:45

标签: c pointers segmentation-fault double-pointer

#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而崩溃

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

2 个答案:

答案 0 :(得分:2)

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

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

到:

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

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

还要记住not to cast the result of malloc

答案 1 :(得分:0)

正如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);
}