【发布时间】:2019-02-28 09:09:21
【问题描述】:
我很确定这与我对 calloc() 的使用有关,但我不明白为什么。该程序的目标是让char* C 包含char* A 中不在char* B 中的字符。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char* diff(char* A, char*B);
int main() {
char* A = {'q','g','e','\0'};
char* B = {'a','d','e','\0'};
char* C = diff(A,B);
printf("%s", C);
free(C);
return(0);
}
int search(char* S, char c) {
int i=0;
while( S[i]!='\0' ){
if( S[i]==c ) break;
i++;
}
if( S[i]=='\0' ) return -1;
else return i;
}
char* diff(char* A, char* B) {
int i;
char* C = calloc(strlen(A), sizeof(char));
assert(C != NULL);
int lengthC = 0;
for (i = 0; i < strlen(A); i++) {
if (-1 != -1) {
C[lengthC] = A[i];
lengthC++;
}
}
C[lengthC] = '\0';
return C;
}
【问题讨论】:
-
if (-1 != -1)会是真的吗? -
char* A = {'q','g','e','\0'};不起作用,你需要char A[] = { 'q','g','e','\0' };,当然B也是如此。我在程序中没有看太多其他内容,但显然if (-1 != -1)似乎很粗略。哦,你可以做return 0;。并不是说return(0);破坏了任何东西,但它使它看起来像一个函数调用,而实际上并非如此。 -
投票关闭是一个简单的错字,因为
if (-1 != -1)永远不会是真的,因此每个字符串都会在索引 0 处以空值终止。启用编译器警告。此外,您不会为新字符串中的空终止符分配空间。 -
@JeremyP OP 忽略 16 条编译器消息并转而询问互联网的问题在我的书中并不好,但无论如何......
-
也没有分配足够的内存 - 你需要
strlen(A)+1这样你就有空间给'\0'
标签: c segmentation-fault dynamic-memory-allocation calloc