Eingebettete schriftliche Testinterviewfragen (Tag 11)


Vorwort

Dieser Artikel beantwortet weiterhin Fragen.

1. Bytestrom, Datagramm, Nachricht

1. Datagramm (Datagramm): Ein Datagramm ist eine unabhängige Nachrichteneinheit einer bestimmten Größe, die als Grundeinheit für die Übertragung in der Netzwerkkommunikation verwendet wird. Jedes Datagramm ist unabhängig, mit Nachrichtengrenzen und Integrität. Es enthält notwendige Identifikationsinformationen wie Quelladresse, Zieladresse, Paketlänge usw. und kann gemäß verschiedenen Netzwerkprotokollen gekapselt werden. Datagramme werden normalerweise über ein datagrammorientiertes Protokoll wie UDP transportiert.

2. Byte-Stream: Byte-Stream ist eine Reihe kontinuierlicher Byte-Datenströme, die als Grundeinheit für die Übertragung in der Netzwerkkommunikation verwendet werden. Ein Bytestrom kennt keine Nachrichtengrenzen oder -struktur, er wird als kontinuierliche Folge von Bytes übertragen. Byteströme werden typischerweise über ein Bytestrom-orientiertes Protokoll wie TCP transportiert. Bei der Byte-Stream-Übertragung werden Daten zur Übertragung in kleinere Datensegmente (Datenpakete) aufgeteilt. Der Empfänger muss den Byte-Stream gemäß dem Anwendungsprotokoll analysieren und verarbeiten, um das ursprüngliche Datenformat und die ursprüngliche Bedeutung wiederherzustellen.

3. Nachricht: Eine Nachricht ist eine Dateneinheit mit Struktur und Semantik, die in der Netzwerkkommunikation übertragen wird. Die Nachricht besteht aus einem Header und einem Text. Der Header enthält Metadateninformationen und der Text enthält spezifische Dateninhalte der Anwendungsschicht. Die Struktur der Nachricht kann entsprechend den Anforderungen der Anwendung vordefiniert, festgelegt oder dynamisch bestimmt werden. Nachrichten können je nach gewähltem Netzwerkprotokoll und Transport als Datagramme oder Byteströme übertragen werden.

主要区别如下:

1. Datagramme sind unabhängig, haben Nachrichtengrenzen und Integrität; Byteströme sind kontinuierliche Bytesequenzen ohne klare Nachrichtengrenzen.

2. Datagramme werden über datagrammorientierte Protokolle (z. B. UDP) übertragen, Byteströme werden über bytestromorientierte Protokolle (z. B. TCP) übertragen.

3. Eine Nachricht ist eine Dateneinheit mit Struktur und Semantik und kann in Form eines Datagramms oder Bytestroms übertragen werden.

2. So führen Sie Bibliotheken und Module in Makefile ein

引入库:

Fügen Sie Linkanweisungen für die Bibliothek im Makefile hinzu: Verwenden Sie in der Zielabhängigkeitsregel im Makefile den Parameter -l, um den Namen der Bibliothek anzugeben, z. B. -lmylib, wobei mylib der Name der einzuführenden Bibliothek ist.
Geben Sie den Suchpfad der Bibliothek an: Wenn sich die Bibliotheksdatei nicht im Standardsuchpfad befindet (z. B. /usr/lib), können Sie den Parameter -L verwenden, um den Pfad der Bibliotheksdatei anzugeben, z. B. -L/path /to/mylib, wobei /path/to/mylib der Pfad zur Bibliotheksdatei ist.

引入模块/头文件:

Verwenden Sie die #include-Direktive, um Header-Dateien in die Quelldatei einzufügen: Verwenden Sie in der Quelldatei, die ein bestimmtes Modul verwenden muss, die #include-Direktive, um die Header-Datei des entsprechenden Moduls einzuschließen, sodass die Funktionen, Variablen usw. definiert sind darin kann in der Quelldatei verwendet werden. .

3. Was passiert, wenn Sie einen Speicherplatz mehrmals freigeben?

1. Undefiniertes Verhalten: Gemäß den Sprachstandards von C und C++ sind mehrere Freigabevorgänge auf demselben Speicherplatz undefiniertes Verhalten. Dies bedeutet, dass der Compiler, das Laufzeitsystem oder das Betriebssystem mit dieser Situation auf jede Art und Weise umgehen können, einschließlich Abstürzen, abnormaler Programmbeendigung, Datenbeschädigung usw.

2. Kann Speicherfehler verursachen: Das mehrmalige Freigeben desselben Speicherabschnitts kann zu Speicherfehlern führen. Bei der ersten Freigabe wird der Speicherplatz als nicht verfügbar markiert. Bei einer erneuten Freigabe ist das System möglicherweise nicht in der Lage, den Speicher ordnungsgemäß zu verwalten, was zu Speicherzugriffsfehlern oder Schäden an anderen Datenstrukturen führen kann.

3. Speicherverlust: Das mehrmalige Freigeben desselben Speicherbereichs kann zu Speicherverlusten führen. Wenn der Zeiger nach der ersten Freigabe nicht explizit auf NULL gesetzt wird oder anderer Speicher neu zugewiesen wird, kann der Zeiger nicht erneut verwendet werden, um Speicher zuzuweisen oder festzustellen, ob der Speicher freigegeben wurde, was zu einem Speicherverlust führt.

4. Programmausnahme oder -absturz: Das wiederholte Freigeben desselben Speicherbereichs kann zu einer Programmausnahme oder einem Programmabsturz führen. Dies liegt daran, dass das Betriebssystem oder Laufzeitsystem möglicherweise die Ausführung des Programms beendet, wenn ein ungültiger Freigabevorgang festgestellt wird, um das System und andere Prozesse vor Beeinträchtigungen zu schützen.

Codetest:

#include <stdio.h>
#include <malloc.h>


int main(void)
{
    
    
    int* p = (int*)malloc(20);

    free(p);
    free(p);

    return 0;
}


Laufergebnisse:
Fügen Sie hier eine Bildbeschreibung ein
Hier kann festgestellt werden, dass das Programm direkt abnormal abstürzt.

4. Was passiert, wenn die Zeichenoperationsfunktion die Grenze überschreitet?

1. Pufferüberlauf: Der Zugriff außerhalb der Grenzen kann zu einem Pufferüberlauf führen. Beispielsweise kopiert die Funktion strcpy den Inhalt der Quellzeichenfolge in den Zielzeichenfolgenpuffer. Wenn die Länge der Quellzeichenfolge die Größe des Zielpuffers überschreitet, kommt es zu einem Pufferüberlauf, der dazu führt, dass der Zielpuffer und die angrenzenden Speicherbereiche beschädigt werden überschrieben werden. .

2. Speicherbeschädigung: Ein Zugriff außerhalb der Grenzen kann zu einer Speicherbeschädigung führen. Zugriffe über den dem Zielpuffer zugewiesenen Speicherbereich hinaus können Speicherorte ändern, die nicht zum Zielpuffer gehören. Dadurch können andere Variablen, Datenstrukturen oder Funktionszeiger zerstört werden, was dazu führen kann, dass das Programm nicht ordnungsgemäß ausgeführt wird oder abstürzt.

3. Sicherheitslücken: Der grenzüberschreitende Zugriff kann Sicherheitslücken wie Pufferüberlaufangriffe verursachen. Böswillige Benutzer können Out-of-Bounds-Zugriff nutzen, um den Kontrollfluss des Programms zu überschreiben und so Remote-Codeausführung, Denial-of-Service und andere Angriffe zu erreichen.

为避免这些问题,应该始终确保字符操作函数的输入参数符合预期,遵循正确的使用方式:

1. Stellen Sie sicher, dass der Zielpuffer groß genug ist, um den gesamten Inhalt der Quellzeichenfolge unter Berücksichtigung der Größe der End-of-String-ID ('\0') aufzunehmen.

2. Verwenden Sie eine sichere Version der Zeichenmanipulationsfunktion, z. B. strncpy anstelle von strcpy, die die maximale Länge der Kopie angeben kann, um eine Überschreitung des Zielpufferbereichs zu vermeiden.

3. Überprüfen Sie sorgfältig die Gültigkeit der Eingabeparameter, um sicherzustellen, dass die Länge der Quellzeichenfolge und des Zielpuffers den Erwartungen entspricht, um potenzielle Zugriffe außerhalb der Grenzen zu vermeiden.

Testcode:

#include <stdio.h>
#include <string.h>


int main(void)
{
    
    
    char str[5];

    strcpy(str, "Hello World");
    

    return 0;
}


Laufergebnis:
Fügen Sie hier eine Bildbeschreibung ein

5. Kann ein Signal in QT mit mehreren Slot-Funktionen verbunden werden?

Ein Signal in Qt kann mit mehreren Slot-Funktionen verbunden werden. In Qt werden die Signal- und Slot-Mechanismen verwendet, um die Kommunikation zwischen Objekten zu implementieren. Ein Signal kann mit mehreren Slot-Funktionen verbunden werden. Wenn das Signal ausgelöst wird, werden alle verbundenen Slot-Funktionen aufgerufen.

Mit der Funktion QObject::connect() können Sie Signale und Slot-Funktionen verbinden. Die Funktion connect() akzeptiert zwei Parameter: das Objekt, das das Signal sendet, und das Objekt, das das Signal empfängt. Mit dieser Funktion können Sie ein Signal mit einer Slot-Funktion oder ein Signal mit mehreren Slot-Funktionen verbinden.

以下是一个连接单个信号到多个槽函数的示例:

QObject::connect(sender, &Sender::mySignal, receiver1, &Receiver1::mySlot);
QObject::connect(sender, &Sender::mySignal, receiver2, &Receiver2::mySlot);

Im obigen Beispiel ist das mySignal-Signal des Sender-Objekts mit den Slot-Funktionen (Receiver1::mySlot und Receiver2::mySlot) von zwei verschiedenen Empfängerobjekten (receiver1 und Receiver2) verbunden. Wenn das Sender-Objekt das mySignal-Signal auslöst, werden beide Slot-Funktionen aufgerufen.

Durch die Verbindung eines Signals mit mehreren Steckplatzfunktionen können Sie eine flexiblere Signalverarbeitung und Kommunikation zwischen Objekten erreichen. Dieser Ansatz wird häufig verwendet, um das Observer-Muster zu implementieren oder mehrere unterschiedliche Logiken für dasselbe Ereignis zu verarbeiten.

6. Kann eine Slot-Funktion in QT mehreren Signalen entsprechen?

In Qt kann eine Slot-Funktion mehreren Signalen entsprechen. Die Slot-Funktionen von Qt sind gewöhnliche Mitgliedsfunktionen, die über mehrere Signale mit derselben Slot-Funktion verbunden werden können.

Verwenden Sie die Funktion QObject::connect(), um mehrere Signale mit derselben Slot-Funktion zu verbinden. Hier ist ein Beispiel:

QObject::connect(sender1, &Sender1::mySignal, receiver, &Receiver::mySlot);
QObject::connect(sender2, &Sender2::anotherSignal, receiver, &Receiver::mySlot);

Im obigen Beispiel ist die mySlot-Funktion des Receiver-Objekts mit den Signalen (mySignal und anotherSignal) von zwei verschiedenen Senderobjekten (sender1 und sender2) verbunden. Wenn ein Senderobjekt sein entsprechendes Signal auslöst, wird die mySlot-Slot-Funktion des Empfängerobjekts ausgelöst.

Diese Methode kann verwendet werden, um dieselbe Reaktionslogik auf ähnliche Ereignisse oder Signale zu implementieren. Durch die Verbindung mehrerer Signale mit derselben Slot-Funktion wird der Code prägnanter und wartbarer.

需要注意的是,当一个槽函数连接到多个信号时,如果信号的参数类型不同,或者信号的参数顺序不同,需要确保槽函数能够正确处理这些参数,否则可能导致运行时错误或逻辑问题。

Zusammenfassen

Das ist alles für diesen Artikel.

Supongo que te gusta

Origin blog.csdn.net/m0_49476241/article/details/132291416
Recomendado
Clasificación