代碼:
#include <stdio.h>
#include <stdlib.h>
int* divided_by(int* s1, unsigned int n1, int* s2, unsigned int n2)
{
int *r =(int * )malloc (n1 * sizeof(int));
if(!r)
{
printf("couldn't allocate memery");
exit (1);
}
int flag=0;
int i=0,j=0,c=0;
while(i<n1)
{
while(j<n2)
{
if((*(s1 i) % *(s2 j)==0) )
{
flag=1;
}
j ;
}
if(flag==0) {
*(r c) = *(s1 i);
c ;
}
flag=0;
j=0;
i ;
}
return r;
}
int main() {
int s1[]={1,10, 5, 4, 21, 49, 24};
int s2[]={2,3};
int *r= divided_by(s1,7,s2,2);
for(int i=0;i<sizeof(r);i )
{
printf("%d\t",r[i]);
}
return 0;
}
該函式應回傳新陣列“r”,其中包含不能被第二個陣列中的所有元素除的元素,當我回傳陣列“r”并嘗試在 main 中列印它時,我得到諸如 0 0 .c 之類的垃圾
uj5u.com熱心網友回復:
因此,您的 divide_by 作業正常,但我會對其進行一些優化,以使其消耗更少的記憶體并更快。
無論如何,問題是你在主回圈中......
for(int i=0;i<sizeof(r);i )
{
printf("%d\t",r[i]);
}
您將 r 宣告為 int 指標,這意味著 r 顯示陣列中第一個整數的位置。因此 sizeof(r) 回傳 8(一個 int 指標的大小,即 8 個位元組)。在此特定示例中,您的函式 divide_by 回傳一個包含 3 個元素的指標,但您列印其中的 8 個,因為您得到了 3 個正確的元素(1、5、49)和 5 個垃圾。
一個解決方案可能是撰寫一個計算陣列長度的函式,例如......
int len(int *r)
{
int len;
len = 0;
while (r[len])
len ;
return len;
}
確保系統將 r 中未使用的記憶體初始化為零。或者使用 calloc() 代替 malloc()。這將確保 len() 函式在任何系統上都能正常作業。
然后在 for 回圈的條件下使用這個函式。像這樣...
for(int i=0;i<len(r);i )
{
printf("%d\t",r[i]);
}
在此之后,您將獲得所需的輸出。
uj5u.com熱心網友回復:
正如許多人所指出的,您的代碼中的主要問題是您使用sizeof(r)的好像是陣列中可用專案的數量。由于回傳值必須是新陣列,因此您需要找到一種方法來傳遞專案數或發出結束信號。0我會在陣列末尾使用一個標記值(我假設沒有人會通過 a0來檢查它是否可整)。其他選項包括將長度保存在陣列的第一個位置。
我進行了一些修改divided_by以使 ir 更高效和更清潔:現在它在找到第一個除數時停止檢查。我也在main分配的記憶體中釋放divided_by.
#include <stdio.h>
#include <stdlib.h>
int* divided_by(int* s1, unsigned int n1, int* s2, unsigned int n2)
{
int *r =(int *) malloc ((n1 1) * sizeof(int)); /* n 1 for the sentinal*/
if(!r)
{
printf("couldn't allocate memery");
exit (1);
}
int i=0, c=0;
while(i < n1)
{
int j=0;
while ((j < n2) && (s1[i] % s2[j])) /* once it failed, stop checking*/
{
j ;
}
if(j == n2)
{
r[c] = s1[i];
c ;
}
i ;
}
r[c] = 0; /*sentinel */
return r;
}
int main() {
int s1[]={1,10, 5, 4, 21, 49, 24};
int s2[]={2,3};
int *r= divided_by(s1, 7, s2, 2);
for(int i=0 ; r[i] != 0 ; i ) /* until we find the sentinel*/
{
printf("%d\t",r[i]);
}
free(r); /* Don't forget to release the memory*/
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419674.html
標籤:
上一篇:不在c中輸入
下一篇:將指標轉換為不相關的型別
