主文件中使用的所有函数都已正确定义。然而,当我尝试进入调试模式时,由于某种原因,IDE在被要求时并没有进入所述函数。相反,它就像一个跨步,忽略行,直到最后一行,所有变量都突然出现在窗口中;在此之前,不存在任何变量。
这是主文件:
#include "pointers.h"
int main(void){
whatisapointer();
whatisthesizeofapointer();
whatareNpointersplacedsuccessively(6);
return 0;
}
用于定义main中函数的pointers.c文件:
#include "pointers.h"
void whatisapointer(){
int *pointer;
pointer = allocateOneInteger();
*pointer = 42;
}
void whatisthesizeofapointer(){
int a = sizeof(char);
int b = sizeof(int);
int c = sizeof(char*);
int d = sizeof(int*);
}
void whatareNpointersplacedsuccessively(int N){
int i, *Npointer, *current;
char *Npointerchar, *currentchar;
Npointer = allocateNInteger(N);
current = Npointer;
current = Npointer+1;
current = Npointer+2;
for(i=0;i<N;i++) *(Npointer+i) = i;
N=2*N;
Npointerchar = allocateNChar(N);
currentchar = Npointerchar;
currentchar = Npointerchar+1;
currentchar = Npointerchar+2;
for(i=0;i<N;i++) Npointerchar[i] = 65+i;
Npointer[N-3] = 0x68676665;
current = Npointer+N-3;
}
int* allocateOneInteger(){
return (int*)malloc(1*sizeof(int));
}
int* allocateNInteger(int N){
return (int*)malloc(N*sizeof(int));
}
char* allocateNChar(int N){
return (char*)malloc(N*sizeof(char));
}
void echange(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void echangep(int *pa,int *pb)
{
int temp;
temp=*pa;
*pa=*pb;
*pb=temp;
}
/* Fonction allocateNFloat
*/
void allocateNFloat(int N){
}
以及makefile:
CC := gcc
FLAGS := -g -Wall -Werror
all : prog
prog : pointers.o mainpointers.o
$(CC) pointers.o mainpointers.o -o prog
fonctions.o : pointers.c pointers.h
$(CC) -c pointers.c $(FLAGS) -o pointers.o
mainpointers.o : mainpointers.c pointers.h
$(CC) -c mainpointers.c $(FLAGS) -o mainpointers.o
clean :
rm -f *.o
rm -f prog
我做了一些研究,但没有一项能帮助我解决这个问题。
您很可能会发现编译器正在优化您的代码,因为函数没有副作用。(如果你不熟悉副作用的概念,要点是"程序状态的变化可能会影响程序的其他部分"——编译器会积极删除无副作用的代码,因为根据定义,这样做不会改变程序的行为。(
即使分配内存也不是一个副作用,因为正确的代码永远不能判断程序的另一部分是否分配了内存。
最简单的副作用是打印出您想要通过调试器检查的任何中间计算的结果;这将迫使优化器保留代码。
例如,
int foo() //no side effects, will be optimized to an empty function or pruned.
{
char *test = malloc(4096);
strcpy(test, "My test string");
return 0;
}
int foo() //dumb side effects
{
char *test = malloc(4096);
strcpy(test, "My test string");
printf("%02x", ((int)test & 0xff) ^ (test[0]) );//make output depend on the operations you wish to observe
return 0;
}
验证编译器是否正在修剪代码的另一种方法是反汇编生成的对象文件。。。您应该看到这些函数由一个"return"指令组成。。。这是调试器通过突出显示结束大括号来显示的内容。