簡體   English   中英

我不斷遇到細分錯誤,我不確定為什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM