我試圖從函式指標回傳一個陣列,代碼作業但在 C 中顯示“不兼容的指標型別”的警告。我想回傳一個陣列,它已經是動態分配的。有人可以告訴我問題和解決方案嗎
#include <stdlib.h>
#include<stdio.h>
unsigned short *reverse_seq(unsigned short num)
{
if(num==0) return NULL;
int size=num 1;
int* numbers=(int *) malloc(size*sizeof(int));
for(int i=0;i<num;i ){
numbers[i]=num-i;
}
for(int i=0;i<num;i ){
printf("%d ",numbers[i]);
}
return numbers;
}
int main(void)
{
int num=5;
reverse_seq(num);
return 0;
}
有人可以給我這個警告的解決方案嗎?
uj5u.com熱心網友回復:
- 您的函式被宣告為回傳
unsigned short *,但您為 s 分配空間int并嘗試回傳一個int*. 我假設您想將unsigned shorts 存盤在分配的記憶體中。 - 當您回傳指向動態分配記憶體的指標時,您應該始終將該指標分配給一個變數,以便您可以
free分配記憶體。
#include <stdio.h>
#include <stdlib.h>
unsigned short *reverse_seq(unsigned short num) {
if (num == 0) return NULL;
// corrected allocation (there's no need for num 1 elements either):
unsigned short *numbers = malloc(num * sizeof *numbers);
if(numbers) { // check that allocation worked
for (int i = 0; i < num; i ) {
numbers[i] = num - i;
}
}
// printing moved to `main` to make use of the data there
return numbers;
}
int main(void) {
unsigned short num = 5; // same type as `reverse_seq` wants
unsigned short *numbers = reverse_seq(num);
if(numbers) { // again, check that allocation worked
for (int i = 0; i < num; i ) {
printf("%d ", numbers[i]);
}
free(numbers); // free the memory
}
}
uj5u.com熱心網友回復:
如果你想回傳一個陣列,unsigned short你應該分配一個陣列,unsigned short但不是ints:
unsigned short* reverse_seq(unsigned short num)
{
if (num == 0)
return NULL;
unsigned short* numbers = malloc(num * sizeof(unsigned short));
if (numbers) {
for (unsigned short i = 0; i < num; i ) {
numbers[i] = num - i;
}
}
return numbers;
}
uj5u.com熱心網友回復:
嘗試
#include <stdio.h>
#include <stdlib.h>
unsigned short *reverse_seq(unsigned short num) {
if (num == 0) return NULL;
int size = num 1;
unsigned short *numbers = malloc((size_t) size * sizeof(unsigned short)); // THIS IS THE IMPORTANT CHANGE
for (int i = 0; i < num; i ) {
numbers[i] = (unsigned short) (num - i);
}
for (int i = 0; i < num; i ) {
printf("%d ", numbers[i]);
}
return numbers;
}
int main(void) {
int num = 5;
unsigned short *res = reverse_seq((unsigned short) num);
free(res);
return 0;
}
這將解決原始警告的主要問題。
重要的是分配您回傳的正確型別的記憶體。問題是您在請求int*指標時回傳 a unsigned short*。不這樣做會對以后訪問記憶體產生影響,因為從回傳的指標訪問的記憶體布局與您分配記憶體序列的方式不匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/412249.html
標籤:
