小编Coc*_*nop的帖子

如何在二叉搜索树的x级找到节点数(有限制)

你好我遇到这个问题的问题是制作一个只使用二叉树头指针和树的所需级别(高度)的函数,如:

int countLevel(tree_type tree, int n)
Run Code Online (Sandbox Code Playgroud)

我已经考虑了一段时间了,我似乎无法找到解决方案而不必在函数中添加另一个值来表示树的运行数/高度(我认为有一种方法来表示它)没有改变功能本身?)

PS我现在在C上编码.

c binary-search-tree

3
推荐指数
1
解决办法
87
查看次数

struct成员上的free()仅在Debug中导致Hardfault

我正在开发STM32F7。当我free()在以下(简化)代码中点击时,会触发一次Hardfault :

typedef struct
{
    uint8_t size;
    uint8_t* data;
}my_struct;

void foo()
{
     my_struct msg;
     msg.size = 5;
     msg.data = malloc(msg.size);
     if(msg.data != NULL)
     {
         free(msg.data); // Hardfault
     }
}
Run Code Online (Sandbox Code Playgroud)

我在GDB中一步一步地free()找到了引起Hardfault的汇编指令:

ldrd    r1, r3, [r5, #8]
Run Code Online (Sandbox Code Playgroud)

的值r5就是0x5F0FE9D0

CFSR是,0x8200并且MMFARBFAR寄存器都包含0x5F0FE9D8

看着LDRDR在网络上的问题,我试图添加__attribute__((__packed__))my_struct定义。当通过指针/结构使用未对齐的内存访问时,应该强制编译器生成2x LDR

这样,我在运行时不再需要Hardfault。好...

出于好奇,我想在此修改后通过GDB检查地址,并且感到惊讶!没有任何变化(我的意思是关于地址),尽管有了并生成了我的Hardfault(但仅在GDB调试执行中),我最终还是再次命中了LDRD指令packed

在删除属性并比较MMFARBFAR寄存器的值后,我启动了新的运行,当我不在GDB中时,我得到了0x41AFFE60

  • 为什么在调试器中看不到2x LDR
  • 更一般地说,无论有没有GDB,为什么我没有相同的行为?
  • 是 …

c gdb arm stm32 memory-alignment

3
推荐指数
1
解决办法
85
查看次数

vim如何替换反斜杠和&

我正在使用vim,我想替换
&\\ \hline\\ \hline Can有人可以教我如何做到这一点吗? %s/\&\\/\\/gc没用.这是为乳胶桌.

vim replace

2
推荐指数
1
解决办法
80
查看次数

分配uninitilialized void*指针

#include <stdio.h>

void wat(void *ptr){
    *(int*)ptr = 0x4A424F4B;
    return;
}

int main(int argc, char **argv){
    FILE *wtf = fopen("wat", "wb");
    void *ptr;
    wat(ptr);
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

这实际上编译并没有错误执行,你甚至可以fwrite的内容*(int*)ptr,你会得到0x4A424F4B.但是,当您删除此行时:

FILE *wtf = fopen("wat", "wb");
Run Code Online (Sandbox Code Playgroud)

*(int*)ptr = 0x4A424F4B;会突然导致分段错误.为什么?

c gcc glibc

1
推荐指数
1
解决办法
100
查看次数

无效指针类型转换

我想打印void指针的地址

u32 j;
for (j = 0; j < sizeof(struct queue_header); j += 4) 
{
    printf("0x%x ",(u32 *)((u32 *)q->q_hdr + j)); //q_hdr  is a void pointer        
}
Run Code Online (Sandbox Code Playgroud)

但该类型转换给出了错误:

警告:从指针强制转换为不同大小的整数[-Wpointer-to-int-cast]

你能告诉我怎么打印地址吗?

c pointers

1
推荐指数
1
解决办法
537
查看次数

scanf和printf格式修饰符

我需要C Primer Plus的练习帮助.

编写一个请求您的名字的程序,并使用它执行以下操作:在比名称宽三个字符的字段中打印它

#include<stdio.h>
#include<string.h>
int main()
{
    char a[40];
    int p,v=0;
    printf("Enter your first name: \n");
    scanf("%s",a);
    p= strlen(a);
    v==p+3;
    printf("%s",a);
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用什么作为宽度的修饰符我应该在%和s之间添加什么?

c string printf modifier

0
推荐指数
1
解决办法
902
查看次数

重新分配会改变值,为什么?

int **arkadas;
int **komsu;

komsu = malloc( t*sizeof( int* ));
arkadas = malloc( t*sizeof( int* ));

for(i=0; i<t; i++)
{
    x=0;
    komsu[i] = malloc( t*sizeof(int) );
    arkadas[i] = malloc( t*sizeof(int) );//temporary malloc

    for(j=0; j<t; j++)
    {
        komsu[i][j]=fark(kelime[i],kelime[j]);
        if(komsu[i][j]==1)
        {
            komsuSayisi++;
            x++;
            arkadas[i][x]=j;
        }
    }
    if(i==2)
    {
        printf("1. value: %d\n",arkadas[2][2]);
    }
    arkadas[i][0]=x+1;//size here
    if(i==2)
    {
        printf("2. value: %d\n",arkadas[2][2]);
    }
    arkadas[i] = (int *)realloc(arkadas[i],x+1);
    if(i==2)
    {
        printf("3.value: %d\n",arkadas[2][2]);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1. value: 150
2. value: 150
3. value: 13243564 (after realloc) …
Run Code Online (Sandbox Code Playgroud)

c

-4
推荐指数
1
解决办法
1670
查看次数

按字母顺序排序字典

我对此有所研究; 但是,当我尝试在我的代码中实现它时,我没有成功.这是我到目前为止:

f = open('ClassA.txt', 'r')
dictionary = {}
for line in f:
    firstpart, secondpart = line.strip().split(':')
    dictionary[firstpart.strip()] = secondpart.strip()
f.close()
sorted_dict = {k: sorted(v) for k, v in dictionary.items()}
print (sorted_dict)
Run Code Online (Sandbox Code Playgroud)

ClassA.txt 将包含例如:

Jakub Scored: 10
Dan Scored: 10
Jake Scored: 9
Harry Scored: 5
Run Code Online (Sandbox Code Playgroud)

我希望这些名字按顺序按字母顺序排列.但是,当我打印sorted_dict它时,它会出现:

{'Jakub Scored': ['0', '1'], 
 'Dan Scored': ['0', '1'], 
 'Harry Scored': ['5'], 
 'Jake Scored': ['9']}
Run Code Online (Sandbox Code Playgroud)

不仅不是有序,而且10由于某种原因得分的人被错误地打印(向后).

python dictionary

-5
推荐指数
1
解决办法
92
查看次数