[英]I keep getting segmentation fault error and I'm not sure where the issue is
[英]I keep getting a segmentation fault and I'm not sure why
我很確定這與我對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*
可以從只有一個值被初始化。
例如,編譯器應就這些警告您。 在海灣合作委員會,我得到:
<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表, q
等於113。
113
是無效的指針。 稍后在您的代碼中執行以下操作:
strlen(A)
它試圖訪問A
指針后面的內存。 由於指針無效,因此未定義會發生什么。 在您的系統上,您會遇到分段錯誤。
A
變量可能應該更改為數組:
char A[] = {'q','g','e','\0'};
或等效:
char A[] = "qge";
這將創建一個字符數組,並使用適當的值對其進行初始化。
您不能以這種方式初始化指針。 char * A = {'q','g','e','\\ 0'}; 它似乎可以在某些編譯器上進行編譯,用這種方式初始化是錯誤的。 請記住,指針變量就像整數數據類型。 它實際上擁有一個包含存儲單元地址的整數值。
相反,它應該作為數組處理:char A = {'q','g','e','\\ 0'}; 數組名稱本身在C中充當指針(當然有一些限制),因此您將數組名稱本身作為參數傳遞給函數。
其次,考慮程序的目標:char * C包含char * A不在char * B中的字符,
語句if(-1!= -1)看起來像是一個錯字,我想你的意思是
如果(search(B,A [i])== -1)
另外,在calloc調用中可能需要進行類型轉換,因為它返回void *
char * C =(char *)calloc(strlen(A),sizeof(char));
考慮到所有這些事情,下面的程序將實現您的目標:
希望這可以幫助 :)
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 = (char *) calloc(strlen(A), sizeof(char));
assert(C != NULL);
int lengthC = 0;
for (i = 0; i < strlen(A); i++) {
if (search(B,A[i]) == -1) {
C[lengthC] = A[i];
lengthC++;
}
}
C[lengthC] = '\0';
return C;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.