首先, 上代碼.
#include <stdio.h>
void* CheckRangeInit(void);
void CheckRangeSet(void* ptHandle, long ForOffset, long BackOffset, long Target, long Resolution);
void main(void)
{
void* test1 = 0;
int data = 0;
static int jjj = 0;
printf_s("\nPlease input data:\t");
scanf_s("%d", &data);
test1 = CheckRangeInit();
CheckRangeSet(test1, 10, 10, data, 360);
}
void* CheckRangeInit(void)
{
#define MaxArray 50
static int i = 0;
long temp[MaxArray][2] = { 0 };
if (i < 49)
return (void*)temp[i++];
else
return (void*)-1;
}
void CheckRangeSet(void* ptHandle, long ForOffset, long BackOffset, long Target, long Resolution)
{
long* set = (long*)ptHandle;
set[0] = Target - ForOffset;
if (set[0] < 0)
set[0] += Resolution;
set[1] = Target + BackOffset;
if (set[1] > Resolution)
set[1] -= Resolution;
// getch();
//printf("Test");
// printf_s("The Range is between %ld to %ld ! \n", set[0], set[1]);
}
問題在最后一個函式. 如果是目前最后幾行都被屏蔽這樣的情況,那么在除錯界面, 查看句柄中的地址中,存放的是我想要的資料..
可是, 如果,我把CheckRangeSet()中函式中,最后的被注釋的陳述句隨便打開一個, 那么句柄地址中的資料 就會變了成其它無用的資料 了.
這是為什么呢?
uj5u.com熱心網友回復:
如果用 printf_s( printf) 改成 puts(), 句柄里的值也不會發生變化 . 怎么這么奇怪?uj5u.com熱心網友回復:
void* CheckRangeInit(void)
{
#define MaxArray 50
static int i = 0;
long temp[MaxArray][2] = { 0 };
if (i < 49)
return (void*)temp[i++];
else
return (void*)-1;
}
這個函式是回傳了區域變數的地址,是無意義的。因為區域變數在函式呼叫結束后會自動釋放的,不能再次使用了。可以考慮加上static將其變成全域變數;
void* CheckRangeInit(void)
{
#define MaxArray 50
static int i = 0;
static long temp[MaxArray][2] = { 0 };
if (i < 49)
return (void*)temp[i++];
else
return (void*)-1;
}
uj5u.com熱心網友回復:
啊平, 用VS2008 上述程式就沒有問題.用VS2019 就有問題......
如何避免.呀...
uj5u.com熱心網友回復:
這個函式是回傳了區域變數的地址,是無意義的。因為區域變數在函式呼叫結束后會自動釋放的,不能再次使用了。可以考慮加上static將其變成全域變數;
void* CheckRangeInit(void)
{
#define MaxArray 50
static int i = 0;
static long temp[MaxArray][2] = { 0 };
if (i < 49)
return (void*)temp[i++];
else
return (void*)-1;
}
確實加上 static 就可以了.. 找了半天問題, 就是沒想到這兒的問題. 謝謝.
奇怪! 為什么原貼中不寫列印函式就可以直接用,不會有問題呢.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/172136.html
標籤:C語言
下一篇:求求C語言大佬帶帶萌新
