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