删除数组中间的元素?
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
我试图从数组中间删除一个元素,然后移动整个内容,但我遇到了一些困难,因为我的测试数组不是 "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