小编chr*_*rds的帖子

"双免费"是什么意思?

正如标题所暗示的那样,我是C的新手并且很快就会出现中期.我正在修改过去的论文,一个反复出现的主题是双重免费问题.我知道这是free()两次调用相同内存位置的过程,但我有几个问题,我不是100%肯定如何回答:

问题1:C中双重释放的结果是什么,为什么会出现这样的问题?

这将导致双倍免费:

char* ptr = malloc(sizeof(char));

*ptr = 'a';
free(ptr);
free(ptr);
Run Code Online (Sandbox Code Playgroud)

我对此的回应是,它会返回0x0内存地址并导致系统不稳定/崩溃.此外,如果我没记错的话,双重自由实际上可以调用malloc两次,这会导致缓冲区溢出,从而使系统容易受到攻击.

简要总结这个问题的最佳方法是什么?

问题2:描述一种特别容易在C中引入双重免费的情况?

我在想当你绕过指针时可能会意外地将它释放到一个函数中,并且在没有意识到的情况下再次释放它?

再说一次,总结这个的"最佳"方法是什么?

c theory double-free

23
推荐指数
3
解决办法
3万
查看次数

钻石继承

假设类D和E和F都从基类B继承,并且类C继承自D和E.

(i)B类有多少副本出现在C类?

(ii)如何使用虚拟继承改变这种情况?解释你的答案.

(iii)对于许多可能在C++中使用多重继承的情况,Java如何避免需要多重继承?

以下是我目前的一些想法,但我绝不是C++方面的专家!

(i)如果C继承自作为B的子类的D和E,那么D和E在技术上是否是超类的副本?然后,如果C继承自D和E,那意味着C中有2个B副本.

(ii)使用虚拟有点类似于在Java中使用Abstract(我认为).现在给出这个,这意味着在C中不会有多个B副本,因为实例化将被级联到所需的级别.我不确定如何说出我的解释但是说B有一个叫做print()的函数打印"我是B"而C覆盖了这个函数put print"我是C".如果您在没有虚拟的情况下在C上调用print(),则最终打印"我是B",使用虚拟将意味着它将打印"我是C".

(iii)我的想法是Java可以使用接口来避免使用多重继承.您可以实现多个接口,但只能扩展一个类.我不确定还有什么要添加,所以任何输入或相关资源都会有所帮助.

c++ inheritance diamond-problem

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

如何正确显示纳米二维到二次转换

我有一个BFS算法来解决8-Puzzle,其中一个项目要求是输出找到最浅层解决方案所需的时间.

我正在使用System.nanoTime()跟踪应用程序运行时间,因为它在一秒钟内解决了大部分给定的谜题.

我遇到的问题是,我将我的转换nanoTime为秒,它以一种奇怪的格式显示.

使用以下代码:

final long startTime = System.nanoTime();

//algorithm code removed for simplicity this all functions correctly


final long duration = System.nanoTime() - startTime;
final double seconds = ((double)duration / 1000000000);
System.out.println("Nano time total: " + duration);
System.out.println("solution Time : " + seconds + " Seconds");
Run Code Online (Sandbox Code Playgroud)

这会产生输出:

 Nano time total: 916110
 solution time : 9.1611E-4 Seconds 
Run Code Online (Sandbox Code Playgroud)

我也尝试使用浮点数来表示值.

是否有人能够提供更好的转换/显示方式,也许使用格式输出语句?

感谢您抽出宝贵时间阅读我的问题.

java nanotime

4
推荐指数
2
解决办法
2万
查看次数

C++ 编译器如何处理模板

你们中的一些人可能从我最近的帖子中知道我正在为 C++ 考试而学习,这门课的内容非常糟糕。我基本上必须自己自学一切,所以在这里请耐心等待。

这是一道考试题:

(i) 解释 C++ 语言中定义的模板概念。一定要区分程序员做什么和编译器做什么。

我目前的理由:

(i) 模板允许函数或类使用泛型进行操作。这允许程序员一次有效地编写 X 功能,并且能够将此功能用于许多不同的数据类型,而无需多次重写应用程序或应用程序的一部分。

我的问题是我不知道编译器如何处理模板的使用。

我不确定编译器在这个阶段做了什么,如果有人能解决这个问题会很有帮助。

c++ templates

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

为什么这个二叉树不是堆?

我一直在教自己考试,并遇到了以下问题:

"给出以下二元树不是堆的两个不同原因"

    91
   /  \
  77  46
 /  \   \
68  81   11
Run Code Online (Sandbox Code Playgroud)

我知道其中一个原因是因为堆的子项必须小于或等于其父项的值,因此81违反此规则81 > 77,但我不确定另一个答案.

有人可以澄清一下吗?

heap data-structures

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

通过引用而不保持其整数值

我正在提出一个新问题,因为我认为这与我之前关于我之前问题的问题不同:在其他源文件中循环遍历数组的麻烦

我当前的问题是我通过引用另一个函数传入size_t值,然后在该函数内设置所述size_t的值,然后我可以在另一个函数中.

我面临的问题是当我传入size_t变量时,设置值的函数正确设置它的值,但是当我返回声明变量的源文件时,它再次具有"随机"值.

任何人都有任何想法为什么会这样?

system_handler.c

size_t ship_size;
size_t asset_size;

mayday_call* mday_ptr;
ship* ship_ptr;
rescue_asset* assets_ptr;

mday_ptr = read_mayday_file();
ship_ptr = read_ship_locations(&ship_size);
assets_ptr = read_recuse_assets(&asset_size);

printf("ships size : %d\n", ship_size);
printf("assets size : %d\n", asset_size);
Run Code Online (Sandbox Code Playgroud)

ship.c

ship* read_ship_locations(size_t* size){
//no_of_lines is an unsigned int
//locof is a char array containing a file name
    no_of_lines = (count_lines(locof) -1 );
    printf("number of lines = %d \n", no_of_lines);


    size = (unsigned int)no_of_lines;
    size = no_of_lines;

}
Run Code Online (Sandbox Code Playgroud)

rescue_assets.c

rescue_asset* read_rescue_assets(size_t* size) {
    //no_of_lines is …
Run Code Online (Sandbox Code Playgroud)

c parameter-passing pass-by-reference

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

C当使用struct*= struct时,如何解决不兼容指针类型的赋值问题

我在这些论坛上搜寻了一个寻找问题的解决方案,但我似乎找不到我的具体解决方案.

我遇到的问题是,我想实现一个链表方面,但我并不关心列表的头部,我只需要知道结构的顺序.

一般的想法是:

struct 1 - > struct 2-> struct n-> struct n + 1

所以我可以去:

struct n - > struct n-1 ........

我已经定义了我的标题:

 typedef struct {

        unsigned int value;
        struct item* prev;


    } item;
Run Code Online (Sandbox Code Playgroud)

我从一个简单的文件读取多个项目值,基本上是:

23
421
12
234
etc ...
Run Code Online (Sandbox Code Playgroud)

我将项目加载到malloc内存区域足够大,当我从文件中读取它时,我这样做:

item* items;
items = malloc(no_of_lines * sizeof(item));

 for (i = 0; i < no_of_lines; i++) {
        if (fscanf(fp, "%d", &item[i] != EOF) {
      }
    }
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将前一个项目分配给项目时:

for (i = 0; i < no_of_lines; i++){
   if(i != 0){ …
Run Code Online (Sandbox Code Playgroud)

c struct pointers

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

使用strsep/strdup将C字符串操作为struct变量时的C分段错误

我再次出现另一个分段错误(呻吟).

为了得到我现在的位置,我在这里有其他问题的帮助.

这个功能背后的想法是:

  • 传入一个字母*
  • 将传入的char*复制到堆上并指向此位置
  • 使用strsep根据','分隔符拆分"字符串"
  • 将这些拆分标记分配给结构变量
  • 释放指针

这是我传递给函数的内容:

gga_sentence结构:

typedef struct gga_sentence{

    const char *untouched_sentence;
    gsa_sentence *gsa;
    char *sentence_id;
    int time_stamp;
    double latitude;
    char north_south_id;
    double longitude;
    char east_west_id;
    int quality;
    int no_of_satellites;
    double horizontal_dillution;
    double altitude;
    char altitude_units;
    double geodial_seperation;
    char geodial_seperation_units;
    char* age_of_data_in_seconds;
    char *checksum;

}gga_sentence;
Run Code Online (Sandbox Code Playgroud)

gga_parsed是:

    gga_sentence *ggas_parsed;
    ggas_parsed = malloc(10*sizeof(gga_sentence));
Run Code Online (Sandbox Code Playgroud)

其中line是char [100],使用从文件读取的行填充,这很好.

strncpy(&ggas_parsed[number_of_gga_parsed].untouched_sentence, line, strlen(line));
            printf("GGA UNTOUCHED: %s", &ggas_parsed[number_of_gga_parsed].untouched_sentence);
Run Code Online (Sandbox Code Playgroud)

initiate_gga_values(&ggas_parsed [number_of_gga_parsed],&ggas_parsed [number_of_gga_parsed] .untouched_sentence);

上面的printf声明:

printf("GGA UNTOUCHED: %s", &ggas_parsed[number_of_gga_parsed].untouched_sentence);
Run Code Online (Sandbox Code Playgroud)

生产:

GGA UNTOUCHED: $GPGGA,151019.000,5225.9627,N,00401.1624,W,1,09,1.0,38.9,M,51.1,M,,0000*72
Run Code Online (Sandbox Code Playgroud)

所以当我通过以下方式将其传递给上述功能时: …

c segmentation-fault

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