【发布时间】: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 <stdlib.h>,但还有其他问题 -
哦,你错过了包含
<stdlib.h>使this question 非常相关。我建议您阅读它及其答案。 -
这个程序应该做什么?给定输入的预期输出是多少?
-
最后,与您的问题有些相关,但编译器不会给出一些警告吗?警告是你做错了什么的迹象,你应该修复的东西。例如,您有一个
return;语句,没有返回值。这在声明为返回int的函数中无效(如main是)。
标签: c pointers segmentation-fault double-pointer