我很确定这与我使用 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;
}
最佳答案
char*
指针的初始化可能如下所示:
char *A = { (char*)(void*)(uintptr_t)5 };
这会将文字值 5
指定为 A
指针的值。 A
指针将(可能)指向无效的内存位置。
转换 (char*)(void*)(uintptr_t)
(或类似的转换)可能由编译器隐式完成。编译器至少发出有关从整数到指针的隐式转换的警告是件好事。
您还可以“超出”{
}
括号内的元素数量。即:
char* A = { 1, 2, 3, 4, 5, };
数字 2, 3, 4, 5,
被忽略,因为 char*
可能只从一个值初始化。
编译器应该警告你这些,例如。在 gcc 中我得到:
<source>:6:16: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion]
char* A = {'q','g','e','\0'};
^~~
<source>:6:20: warning: excess elements in scalar initializer
char* A = {'q','g','e','\0'};
所以:
char* A = {'q','g','e','\0'};
等于:
char *A = 113;
根据 ascii table,q
等于 113 .
113
是无效指针。稍后在您的代码中:
strlen(A)
它试图访问 A
指针后面的内存。由于指针无效,因此不确定会发生什么。在您的系统上,出现段错误。
A
变量可能应该变成一个数组:
char A[] = {'q','g','e','\0'};
或者等价物:
char A[] = "qge";
这将创建一个字符数组并使用适当的值对其进行初始化。
关于c - 我一直遇到段错误,我不确定为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54921955/