出现在字符串数组C中最后一个值末尾的感叹号

时间:2017-12-12 05:27:22

标签: c arrays malloc

出于某种原因,当我对stringArr [n]进行malloc时,strArr [n-1]的值要么添加'!'最后或用'!'替换最后一个字符。在GDB中,当分配给strArr [n]时,字符串看起来是查找但是当n递增时,当mallocing strArr [n](在这种情况下为n + 1)时,strArr [n-1]得到'!'添加。我不知道为什么会这样。

char** stringArr = malloc(sizeof(char*)*28);
char* token;

int n = 0;
while(n < 28)
{
    token = //tokenize something here
    stringArr[n] = malloc(sizeof(token)+1);
    strcpy(stringArr[n], token);
}

1 个答案:

答案 0 :(得分:2)

stringArr[n] = malloc(sizeof(token)+1);

你不想要这个。因为指针的sizeof是固定的(对于系统而言)。因此,您要分配固定长度的字符串来复制每个标记化的字符串(其长度可能超过您分配的长度)。所以strcpy正在访问甚至没有分配的内存。这是未定义的行为。

这将是

stringArr[n] = malloc(strlen(token)+1);

现在您要确保动态分配的内存的长度能够保存要复制的字符串(NUL终止的char数组)。

另外,检查malloc的返回值。 malloc失败的情况不会遇到访问它的未定义行为。完成后,释放动态分配的内存。