#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而崩溃
编辑: 我想要像这样的输出 输出:新行中的每个单词。
答案 0 :(得分:2)
您没有为ptr
正确分配内存。你需要改变:
ptr = (char **)malloc(8+1);
到:
ptr = malloc( (8+1) * sizeof(char*));
因为您的陈述暗示您要分配8+1
字节(而不是指针)。
答案 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);
}