emacs-28.2 -Q
   M-x term RET RET
   C-SPC

This should send an ASCII NUL (a zero byte) to the pty, but instead it
displays "Mark set" in the echo area.

To fix it, C-SPC needs to get special handling akin to the handling of
C-/.  Here's a patch that also makes C-M-SPC and C-M-/ work.

--- term.el 2022-09-06 17:31:54.000000000 -0400
+++ term-c-spc-fixed.el 2023-06-15 11:21:41.780140053 -0400
@@ -916,6 +916,9 @@
     (define-key map [next] 'term-send-next)
     (define-key map [xterm-paste] #'term--xterm-paste)
     (define-key map [?\C-/] #'term-send-C-_)
+    (define-key map [?\C- ] #'term-send-C-@)
+    (define-key map [?\C-\M-/] #'term-send-C-M-_)
+    (define-key map [?\C-\M- ] #'term-send-C-M-@)
     map)
   "Keyboard map for sending characters directly to the inferior process.")
 
@@ -1359,6 +1362,9 @@
 (defun term-send-del   () (interactive) (term-send-raw-string "\e[3~"))
 (defun term-send-backspace  () (interactive) (term-send-raw-string "\C-?"))
 (defun term-send-C-_  () (interactive) (term-send-raw-string "\C-_"))
+(defun term-send-C-@  () (interactive) (term-send-raw-string "\C-@"))
+(defun term-send-C-M-_  () (interactive) (term-send-raw-string "\e\C-_"))
+(defun term-send-C-M-@  () (interactive) (term-send-raw-string "\e\C-@"))
 
 (defun term-char-mode ()
   "Switch to char (\"raw\") sub-mode of term mode.