删除数组中间的元素?

Deleting an element in the middle of array?

我试图从数组中间删除一个元素,然后移动整个内容,但我遇到了一些困难,因为我的测试数组不是 "right"。我通过使用 strcpy 用字符串填充数组来解决问题。 strcpy上面的注释部分是我之前用的方法(没用)。有人可以解释一下为什么它不起作用吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){

    char *array;
    int i=5;

    array = (char*)calloc(1024, sizeof(char));

    if(array == NULL){
        printf("Out of memory\n");
        return 0;
    }

    //array = "Just some test string";
    strcpy(array, "Just some test string");

    printf("%s\n", array);

    memmove(array+i+1, array+i, strlen(array)-i);
    array[i] = ',';

    printf("%s\n", array);

    memmove(array+i, array+i+1, strlen(array)-i);

    printf("%s\n", array);

    free(array);

return 0;
}

printf 在注释部分正常工作,但 memmove() 使我的程序崩溃!

如果你有这个:

array = "Just some test string";

然后

1) 由于覆盖了 calloc 的指针,您有 memory leak

2) 您正在尝试修改字符串文字。这可能就是它崩溃的原因。修改字符串文字是 undefined behaviour。它们通常存储在只读存储器中。由于 strcpy() 对字符串文字进行了 复制 ,它按预期工作并且此方法失败。

在这些陈述中

memmove(array+i+1, array+i, strlen(array)-i);
array[i] = ',';

试图在位置 5 插入字符 ',',因为变量 i 已用 5 初始化。

所以字符串中包括终止零的部分必须从这个位置开始右移。该部分的长度为

strlen( array ) - i + 1

因为也必须移动终止零。

所以这些语句看起来像

memmove( array + i + 1, array + i, strlen( array ) - i + 1 );
array[i] = ',';

然后在这些语句中

memmove( array + i, array + i + 1, strlen( array ) - i );

这个说法是正确的。表达式 strlen( array ) - i 的计算方式类似于

( strlen( array ) + 1 ) - ( i + 1 )

至于这个说法

array = "Just some test string";

然后指针 array 指向一个字符串文字,虽然 C 中的字符串文字具有非常量字符数组的类型,但它们是不可变的。

任何修改字符串文字的尝试都会导致程序出现未定义的行为。

此外,如果在此语句之前您还使用调用 calloc 的结果初始化了此指针,那么将会发生内存泄漏,因为指针被重新分配并且分配的内存地址丢失。

我试过这样做。

我解决了这个问题:

    *(array+strlen(string)+1)=0;

Null 终止字符串,但如果后续 printf() 正常工作,这将无济于事。

否则见: http://www.java-samples.com/showtutorial.php?tutorialid=591