簡體   English   中英

malloc()返回一個充滿隨機字符的char指針

[英]malloc() returns a pointer to char full of random characters

我在C中有一個簡單的程序,正在嘗試使兩個集合相交(無重復)。 在我的交集結果之后,打印了許多字符。

這與strlen(scommon)= 14而不是2(sizeof(char)* strlen(smin)= 1 * 2)的事實有關。

謝謝。

這是代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* intersection(char *s1, char *s2);

int main(void){


   printf("intersection = %s\n", intersection("ag", "cg"));

   return 0;
}

char* intersection(char *s1, char *s2){
    int i, j;
    char *smin, *scommon;   

    if(strlen(s1) < strlen(s2)){    
        smin = s1; 
        s1 = s2;
    }else{      
        smin = s2;      
    }

    scommon = (char*)malloc(sizeof(char) * strlen(smin));   

    for(i = 0; i < strlen(smin); i++){

        for(j = 0; j < strlen(s1); j++){

            if(smin[i] == s1[j]){

                scommon[i] = smin[i];

                break;
            }
        }
    }

    printf("final length = %d\n", strlen(scommon));     
    return scommon;
}

在此處輸入圖片說明

您忘記了以空結尾的普通字符串。 您必須在最后一個字符后添加一個'\\ 0',否則strlen和printf會一直繼續下去,直到它們擊中一個空字符或使程序崩潰。

通常,您不能依靠malloc返回其中全為0的緩沖區。 如果您希望緩沖區為“空”,則必須自己對其進行初始化,或者改用calloc

scommon = (char*)malloc(sizeof(char) * strlen(smin));

這不會添加額外的字節來容納字符串的空終止符,並且在循環完成之后, intersection也不會添加空終止符。

您可以將其更改為:

scommon = malloc(strlen(smin)+1);
memset( scommon, 0, strlen(smin)+1 );

或在循環完成時添加終止零,並且您知道要將其放置在何處。

或僅使用calloc為您初始化緩沖區:

scommon = calloc(strlen(smin)+1, sizeof(char));

我想主要的問題是(除了null終止問題):

scommon[i] = smin[i];

如果沒有路口,那么i將仍然增加。 並根據malloc函數描述:

新分配的內存塊的內容未初始化,剩余的值不確定。

您應該對scommon使用單獨的計數器。 並添加一個空終止符或將字符串的長度保存在某處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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