C语言 获取双指针的分段错误


#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 stringn");
    scanf("%[^n]",input);
    ptr=(char **)malloc(8+1);
    if(ptr==NULL)
    {
            printf("ptr malloc: errorn");
            return 0;
    }
    for(i=0;i<8;i++)
    {
            ptr[i]=(char*)malloc(MAX);
            if(ptr[i]==NULL)
            {
                    printf("malloc: Errorn");
                    return 0;
            }
    }
    for(i=0;i<8;i++) {
            k=0;
            if(i!=0)
                    j++;
            while(input[j]!=' ' && input[j]!='') {
            ptr[i][k++]=input[j];
            j++;
            }
            ptr[i][k]='';
    }
    for(i=0;i<8;i++)
            printf("%sn",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

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

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

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

自:

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

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

还要记住不要投射马洛克的结果。

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

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

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

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

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

相关内容

  • 没有找到相关文章