Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
H
hp
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Peter Gerwinski
hp
Commits
0d32b910
Commit
0d32b910
authored
6 years ago
by
Peter Gerwinski
Browse files
Options
Downloads
Patches
Plain Diff
Musterlösung 5.11.2018 vervollständigt
parent
c38edbc0
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
20181105/hp-musterloesung-20181105.pdf
+0
-0
0 additions, 0 deletions
20181105/hp-musterloesung-20181105.pdf
20181105/hp-musterloesung-20181105.tex
+70
-1
70 additions, 1 deletion
20181105/hp-musterloesung-20181105.tex
20181105/loesung-2.c
+18
-0
18 additions, 0 deletions
20181105/loesung-2.c
with
88 additions
and
1 deletion
20181105/hp-musterloesung-20181105.pdf
+
0
−
0
View file @
0d32b910
No preview for this file type
This diff is collapsed.
Click to expand it.
20181105/hp-musterloesung-20181105.tex
+
70
−
1
View file @
0d32b910
...
@@ -230,7 +230,76 @@
...
@@ -230,7 +230,76 @@
\solution
\solution
Wird nachgereicht.
\begin{enumerate}
[
\quad
(a)]
\item
\textbf
{
Erklären Sie die Ausgabe.
}
In der Schleife wird
\emph
{
zuerst
\/
}
der nächste Buchstabe
\lstinline
{
target[i + 1]
}
gleich dem aktuellen gesetzt
und
\emph
{
danach
\/
}
der Zähler
\lstinline
{
i
}
erhöht.
Dadurch wird im nächsten Schleifendurchlauf der bereits verschobene Buchstabe
noch weiter geschoben und letztlich alle Buchstaben in
\lstinline
{
target[]
}
durch den an der Stelle
\lstinline
{
pos
}
ersetzt.
\item
\textbf
{
Schreiben Sie die Funktion
\lstinline
|insert
_
into
_
string()| so um,
daß sie den Buchstben
\lstinline
{
src
}
an der Stelle
\lstinline
{
pos
}
in den String
\lstinline
{
target
}
einfügt.
}
\par
\textbf
{
Die Ausgabe des Programms müßte dann
\lstinline
[style=terminal]
{
Hochschule Bochum
}
lauten.
}
Um im String "`Platz zu schaffen"', muß man von hinten beginnen,
also die Schleife umdrehen
\\
(siehe:
\gitfile
{
hp
}{
20181105
}{
loesung-2.c
}
):
\begin{lstlisting}
{
gobble=8
}
for (int i = len; i > pos; i++)
target[i] = target[i - 1];
\end{lstlisting}
\item
\textbf
{
Was kann passieren, wenn Sie die Zeile
\lstinline
{
char test[100] = "Hochshule Bochum";
}
\\
durch
\lstinline
{
char test[] = "Hochshule Bochum";
}
ersetzen und warum?
}
Die Schreibweise
\lstinline
{
test[]
}
bedeutet,
daß der Compiler selbst zählt, wieviel Speicherplatz der String benötigt,
un dann genau die richtige Menge Speicher reserviert
(anstatt, wie wir es manuell getan haben, pauschal Platz für 100 Zeichen).
Wenn wir nun in den String ein zusätzliches Zeichen einfügen,
ist dafür kein Speicherplatz reserviert worden,
und wir
\textbf
{
überschreiben
}
dann Speicher, an dem sich andere Variablen befinden,
was zu einem
\textbf
{
Absturz
}
führen kann.
Da wir hier nur ein einziges Zeichen schreiben,
wird dieser Fehler nicht sofort auffallen.
Dies ist schlimmer, als wenn das Programm direkt beim ersten Test abstürzt,
denn dadurch entsteht bei uns der Eindruck, es sei in Ordnung.
Wenn danach der Fehler in einer Produktivumgebung auftritt,
kann dadurch Schaden entstehen -- je nach Einsatzgebiet der Software
u.
\,
U.
\
erheblicher Vermögens-, Sach- und/oder Personenschaden
(z.
\,
B.
\
Absturz eines Raumflugkörpers).
\item
\textbf
{
Was passiert, wenn Sie
\lstinline
{
char test[100] = "Hochshule Bochum";
}
\\
durch
\lstinline
{
char *test = "Hochshule Bochum";
}
ersetzen und warum?
}
In diesem Fall wird der Speicher für den eigentlichen String
in einem unbenannten,
\textbf
{
nicht schreibbaren
}
Teil des Speichers reserviert.
Unser Versuch, dorthin ein zusätzliches Zeichen zu schreiben,
fürt dann normalerweise zu einem
\textbf
{
Absturz
}
.
In manchen Systemen (Betriebssystem, Compiler,
\dots
)
ist der Speicherbereich tatsächlich sehr wohl schreibbar.
In diesem Fall tritt der Absturz nicht immer und nicht immer sofort auf --
genau wie in Aufgabenteil (c).
\end{enumerate}
\exercise
{
Länge von Strings
}
\exercise
{
Länge von Strings
}
...
...
This diff is collapsed.
Click to expand it.
20181105/loesung-2.c
0 → 100644
+
18
−
0
View file @
0d32b910
#include
<stdio.h>
#include
<string.h>
void
insert_into_string
(
char
src
,
char
*
target
,
int
pos
)
{
int
len
=
strlen
(
target
);
for
(
int
i
=
len
;
i
>
pos
;
i
++
)
target
[
i
]
=
target
[
i
-
1
];
target
[
pos
]
=
src
;
}
int
main
(
void
)
{
char
test
[
100
]
=
"Hochshule Bochum"
;
insert_into_string
(
'c'
,
test
,
5
);
printf
(
"%s
\n
"
,
test
);
return
0
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment