#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *words[] = {"mHello", "kWorld", "kHow", "9Are", "3You?"};
char **parsed = malloc(5);
int i;
for (i = 0; i < 5; i++)
{
int n = strlen(words[i]);
parsed[i] = malloc(n);
strncpy(parsed[i], words[i] + 1, n);
printf("[%s] ", parsed[i]);
}
printf("\n----------------------\n");
for (i = 0; i < 5; i++)
printf("[%s] ", parsed[i]);
return 0;
}
parsed[i]
包含words[i]
,没有第一个字符。
输出
[Hello] [World] [How] [Are] [You?]
----------------------
[▒▒ o] [World] [How] [Are] [You?]
为什么对parsed[0]
的第一次printf调用正常,而第二次调用没有?
此外,如果我从words
中删除一个元素,则此代码可以正常工作。发生了什么事?
答案 0 :(得分:9)
你的malloc
没有为指向字符串的指针分配正确的空间,它应该是
parsed = malloc(sizeof(char*)*5)
答案 1 :(得分:1)
对于初学者来说,**parsed
对于存储在那里的所有指针都不够大。应该分配
parsed=malloc(sizeof(*parsed)*5);
你可以滚动单个字符串分配并将其全部复制到一个像这样:
parsed[i]=strdup(words[i]+1);
这也正确地处理了字符串长度,现在乍一看它看起来可能有一个问题。
答案 2 :(得分:0)
要添加到其他答案,您可以使用valgrind跟踪这些内存错误。
如果您希望代码在这些情况下严重失败,那么另一种工具是address sanitizer。