#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 W1W4 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);
}