我正在尝试以不同的方式在C中声明字符串以准备考试。我们知道C中的字符串是'\0'结尾处的字符数组。然后我发现,即使我声明了一个5个字符的数组并将5个字符放入其中,例如“ abcde”,它也被接受。那么,空字符存储在哪里?
我以以下方式声明了字符串
char str[] = {'a','b','c','d','e'};
char str2[] = "abcde";
char str3[5] = "abcde";
Run Code Online (Sandbox Code Playgroud)
现在,在第3种情况下,我要分配5个字节的空间,并且数组中恰好有5个字符,那么如果string的末尾应将空字符存储在哪里?还是不附加null的情况?第一种情况和第二种情况如何,那里是否附加了null?
strlen()在所有3种情况下均返回5。
我正在尝试使用 python 中的networks.draw() 函数绘制图形。尽管它不是有向图,但我的图的边缘按拓扑排序顺序排列。我想打印看起来像依赖 DAG 的图表以获得更好的可见性。目标是这样的:
我该怎么做?
我正在用 C 进行非常基本的动态分配实践,但遇到了这个问题:当我尝试free()使用 返回的指针进行调用时malloc(),在运行时出现无效指针错误。
当我free()从代码中删除时,它工作正常。我正在使用的指针在返回后无论如何都不会被修改malloc(强制转换除外)。所以这排除了我在网上找到的一些建议。下面是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int num = 0;
//printf("Enter a number: ");
//scanf("%d", &num);
char* p = (char*)malloc(16*sizeof(char));
printf("%p", p);
if(p) {
p = "mark";
printf("\n%s\n", p);
free(p); //when removed no error
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以下是错误消息:
0xa26010
mark
*** Error in `./a.out': free(): invalid pointer: 0x00000000004006b7 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fa968aed7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7fa968af637a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fa968afa53c]
./a.out[0x40061a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fa968a96830]
./a.out[0x4004e9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 …Run Code Online (Sandbox Code Playgroud)