如何将内存分配给宏?

时间:2018-06-11 12:04:25

标签: c

对于下面的代码,我定义了一个宏 abc ,其值已重新定义两次。当我们运行代码时,输​​出是一些垃圾值,我不知道当宏是宏时内核是如何得到垃圾值而内存无法分配给宏 abc ?< / p>

    #include<stdio.h>
    #define abc 10
    #define abc "rd"
    int main()
    {
    printf("%d",abc);
    return 0;
    }

3 个答案:

答案 0 :(得分:10)

宏根本不占用运行时内存,它们是一个完全编译时(实际上甚至是预处理时)的构造。在大多数情况下,您可以将宏视为纯文本替换。因此,您的代码与此完全相同:

#include<stdio.h>

int main()
{
  printf("%d","rd");
  return 0;
}

我相信为什么打印垃圾值非常清楚。

此外,在没有干预#undef的情况下将宏重新定义为其他内容在C中实际上是非法的,因此编译器完全拒绝代码是合理的。

答案 1 :(得分:1)

您已经两次定义了相同的abc宏。您的编译器可能已经警告过您

  

警告:&#34; abc&#34;重新定义#define abc&#34; rd&#34;

你只是忽略了警告,你不应该从警告中学习。为了获得良好的代码实践,请在一个标记下定义宏,使用#ifdef#endif#undef。例如

#ifdef first

#define abc 10

#endif

同样定义第二个宏。

宏在preprocessor阶段被替换,它将考虑abc的最后定义。

最后你的代码看起来像

int main() { printf("%d","rd"); return 0; }

现在%d需要int类型的参数,但您提供了"Rd",即char*类型。因此它打印了一些garbage值。

如何将内存分配给宏?在运行时根本没有为宏分配内存。这些只是文字替代品。

答案 2 :(得分:0)

第二个#define会覆盖第一个abc。所以最终abc是一个字符串文字。现在,您尝试将%d解释为整数,因为您在printf中使用printf look like:

这是int port = 3332; ServerSocket serverSocket = new ServerSocket(port); System.out.println("waiting for connection on port "+port); Socket socket = serverSocket.accept(); System.out.println("connection stablished on port "+port); String clientIPAddress=socket.getRemoteSocketAddress().toString(); System.out.println("client ip address\t"+clientIPAddress); in = socket.getInputStream(); BufferedInputStream bstream=new BufferedInputStream(in); DataInputStream dstream=new DataInputStream(bstream); out = new PrintWriter(socket.getOutputStream(),true); try{ FileOutputStream fos = new FileOutputStream("D://output/Output.mpeg"); while(isDisconnect){ String deviceId=dstream.readLine(); System.out.println(""+deviceId); String timeStamp=dstream.readLine(); System.out.println(""+timeStamp); while ((length = bstream.read(theServer.buf)) > 0) { fos.write(theServer.buf, 0, length); System.out.println("Length\t"+length+"\n"); out.println("received"); } } } catch(Exception ex){ System.out.println(ex); System.exit(0); } printf(&#34;%d&#34;,&#34; rd&#34;);`在预处理器完成其工作之后。