删除数组中间的元素?

时间:2015-12-15 08:20:34

标签: c arrays memory-management dynamic-arrays

我试图从数组中间删除一个元素,然后整理内容,我遇到了一些困难,因为我的测试数据不是“正确”。我通过使用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()会使我的程序崩溃!

3 个答案:

答案 0 :(得分:1)

如果你有这个:

array = "Just some test string";

然后

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

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

答案 1 :(得分:0)

在这些陈述中

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调用的结果初始化此指针,则会出现内存泄漏,因为指针被重新分配并且已分配内存的地址丢失。

答案 2 :(得分:0)

我试着这样做。

我解决了这个问题:

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

Null终止字符串,但如果后续的printf()工作正常,则无法提供帮助。

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